写过程序的人,应该都知道程序里面有变量的概念,通过修改变量的值就可以改变程序的执行结果。
环境变量也是一种变量,它是你在系统中定义的,可以被程序读取和使用的变量,环境变量可以是能被当前进程及子进程使用的全局变量,也可以是只能被当前进程使用的局部变量。
例如,Linux的$LANG这个全局环境变量中存储了当前用户所处的语言环境,如果$LANG的值是"zh_CN.UTF-8",就说明是当前是中文环境,运行中的各程序(进程)就会根据这个环境变量使用中文界面。
如果它的值是"en_US.UTF-8",就说明是英文环境,运行中的程序就会切换到英文界面。当然环境变量只是一个参考,如果运行程序不关心环境变量,或者系统中没有安装相应的语言包的话,那么,可能就不会显示你所希望的语言。
下面是Linux系统中一些常见的环境变量:
变量名
变量描述
PATH
PATH环境变量对应的值是一些由冒号分隔开的路径,系统通过这些路径去查找可执行文件。
当你在shell命令行中执行某个命令时,shell会根据PATH中定义的这些路径,去查找命令对应的可执行文件,如果找到就执行,没找到就抛出“命令找不到”的错误。
USER
当前用户的用户名
HOME
当前用户的主目录的路径
UID
当前用户的用户ID
TERM
默认的终端模拟器
SHELL
用户默认使用的shell,一般是/bin/bash
查看环境变量的值
要查看某个环境变量的值,可以使用以下命令格式:
echo $VARIABLE
上面的VARIABLE是要查看的环境变量的变量名,需要注意的是,这些变量名是区分大小写的,如果大小写不同就可能会得到不同的值。下面是使用echo来显示环境变量的值的例子:
我们还可以用env命令,将所有可以被子进程继承的全局的环境变量显示出来:
如果在env中看不到某个变量,就说明这个变量只能被当前进程(在这里就是shell命令行的进程)使用,我们可以用export命令将某个变量导出成为全局变量,从而让shell创建的子进程(也就是shell执行的程序)也能使用到这个变量。
设置新的环境变量
可以使用下面的命令格式创建一个自定义的环境变量:
VARIABLE_NAME=variable_value
上面的VARIABLE_NAME表示需要创建的环境变量的变量名,variable_value表示该环境变量对应的值。要注意环境变量名是区分大小写的,另外,环境变量名通常使用大写。以下是创建环境变量的例子:
删除环境变量
可以使用unset命令来删除某个环境变量,命令格式如下:
unset VARIABLE_NAME
上面的VARIABLE_NAME表示要删除的环境变量的变量名,以下是删除环境变量的例子:
导出环境变量
默认情况下,新建的环境变量只能被当前shell使用,如果要使其能被shell创建的子进程(也就是shell执行的程序)使用的话,可以通过export命令将其导出为全局的环境变量,例如:
[root@localhost ~]# NEWVARIABLE=12345
[root@localhost ~]# export NEWVARIABLE
[root@localhost ~]# env
..................................................
NEWVARIABLE=12345
..................................................
[root@localhost ~]# cat test/test.c
#include
#include
int main()
{
char * val = getenv("NEWVARIABLE");
if(val == NULL) {
printf("not defined\n");
}
else
printf("%s\n", val);
}
[root@localhost ~]# gcc test/test.c
[root@localhost ~]# ./a.out
12345
[root@localhost ~]#
上面先创建了一个NEWVARIABLE环境变量,然后通过export将其导出为全局环境变量,这样在env中就可以看到这个变量了,同时在C编写的test.c对应的a.out程序执行时,也能读取并显示出这个环境变量的值。
如果没用export导出的话,上面a.out执行时就会显示not defined,也就是找不到环境变量:
[root@localhost ~]# unset NEWVARIABLE
[root@localhost ~]# NEWVARIABLE=12345
[root@localhost ~]# ./a.out
not defined
[root@localhost ~]#
上面我们重新创建了NEWVARIABLE环境变量,但是这次我们没有用export来导出该变量,这样它就只对当前shell起作用,而对shell创建的子进程,本例中就是运行中的a.out程序,就不起作用了,上面就显示了"not defined"信息。
小结
通过环境变量,我们可以控制程序在操作系统中的行为。以下是本节介绍过的和环境变量相关的操作:
命令
描述
echo $VARIABLE
显示某个环境变量的值
env
显示所有全局的环境变量。
VARIABLE_NAME=variable_value
创建一个新的环境变量
unset VARIABLE_NAME
删除一个环境变量
export VARIABLE_NAME
导出一个环境变量,使其成为可以被子进程使用的全局变量。