- 什么是环境变量?
环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数, 是系统提供的一组 name=value 形式的变量.
- 为什么需要环境变量?
环境变量通常具有某些特殊用途, 例如, 在各个目标文件 (.obj) 进行链接的时候, 相关环境变量帮助编译器查找所链接的动静态库的位置, 生成可执行程序. 此外, 环境变量在系统当中通常具有全局属性.
一. 查看环境变量
常见的环境变量
- PATH: 指定命令的搜索路径.
- HOME: 用户家目录 (即用户登录到 Linux 系统中的默认所处目录).
- SHELL: 当前Shell, 它的值通常是
/bin/bash
.
可以通过 echo
指令来查看环境变量, 格式如下:
echo $NAME
, NAME 为待查看的环境变量名称.
比如, echo $PATH
查看环境变量 PATH.
PATH
可以看到, 当执行系统提供的指令时, 不需要在指令前加上其所处的路径; 而当执行自己编写的指令时, 则需要在指令前加上其所处的路径.
出现这种现象的原因是 Linux 系统中存在 PATH 环境变量来存放指令的默认搜索路径集合.
可以看到环境变量 PATH 当中有多条路径, 这些路径由冒号 隔开, 当使用系统提供的指令 (如 ls
) 时, 系统就会查看环境变量 PATH , 然后从左到右依次在各个路径当中进行查找. 而系统提供的指令实际就位于 PATH 当中的某一个路径下 (/usr/bin
), 所以执行系统提供的指令时就算不带路径, 系统也能够通过 PATH 找到其位置.
若想在执行自己编写的指令时, 不带路径, 可以通过以下方法来达成目标.
1. 将自己编写的指令拷贝到环境变量 PATH 的某一路径下
bash
sudo cp 自己编写的指令名 /usr/bin
2. 将自己编写的指令所处的目录导入到环境变量 PATH 当中
bash
export PATH=$PATH:自己编写的指令所处的目录
HOME
任何一个用户在登录 Linux 系统下都有自己的家目录, 环境变量 HOME 中即保存的该用户的家目录.
当用户为普通用户时.
当用户为超级用户 root 时.
SHELL
可以通过查看环境变量 SHELL 来知道当前所用的命令行解释器的种类.
二. 与环境变量相关的指令
echo
显示某个环境变量的值.
env
显示所有的环境变量.
部分环境变量的意义说明:
环境变量名称 | 表示内容 |
---|---|
PATH | 指令的搜索路径 |
HOME | 用户的主工作目录 |
SHELL | 当前Shell |
HOSTNAME | 主机名 |
TERM | 终端类型 |
HISTSIZE | 记录历史命令的条数 |
SSH_TTY | 当前终端文件 |
USER | 当前用户 |
邮箱 | |
PWD | 当前所处路径 |
LANG | 编码格式 |
LOGNAME | 登录用户名 |
export
设置环境变量.
对已有的环境变量做修改
增添新的环境变量
set
显示本地定义的 shell 变量和环境变量.
unset
清除指定的环境变量.
三. 环境变量的组织方式
命令行参数
C 程序总是从 main
函数开始执行, main
函数的原型是:
其中, argc
是命令行参数的个数, argv
是由指向每个命令行参数字符串的指针所构成的字符指针数组.
编写以下代码, 编译生成可执行程序并运行.
c
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 0;
for (; i < argc; i++) {
printf("argc[%d]:%s\n", i, argv[i]);
}
printf("argc[%d]:%s\n", i, argv[i]);
return 0;
}
运行结果如下.
当 mycmd
可执行程序被调用时, argc
的值为 4, argv[0] 指向 ./mycmd 字符串, argv[1] 指向 -a 字符串, argv[2] 指向 -b 字符串, argv[3] 指向 -c 字符串, argv
数组的末尾处总以空指针来标记, 因此, argv[4]为 NULL. 下图描述了命令行参数的组织方式, 被形象地称为命令行参数表.
环境变量
为了使用环境变量, main
函数也可以有如下声明:
envp
是由指向每个以 name=value 形式展现的环境变量字符串的指针所构成的字符指针数组.
编写以下代码, 编译生成可执行程序并运行.
c
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
int i = 0;
for (; envp[i]; i++) {
printf("envp[%d]:%s\n",i, envp[i]);
}
return 0;
}
运行结果如下.
环境指针 environ
每个 C 程序都会收到一张环境变量表, 与命令行参数表一样, 环境变量表是一个字符指针数组, 每个指针指向一个以 '\0' 结尾的环量字符串, 全局变量 environ
则包含了该指针数组的地址.
编写以下代码, 编译生成可执行程序并运行. (libc 中定义的全局变量 environ
指向环境变量表, environ
没有包含在任何头文件中, 所以在使用 environ
时要用 extern
声明.)
c
#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for (; environ[i]; i++) {
printf("%s\n", environ[i]);
}
return 0;
}
运行结果如下.