环境变量是你在系统中定义的,可以被程序读取和使用的变量。
写过程序的人,应该都知道程序里面有变量的概念,通过修改变量的值就可以改变程序的执行结果。
环境变量也是一种变量,它是你在系统中定义的,可以被程序读取和使用的变量,环境变量可以是能被当前进程及子进程使用的全局变量,也可以是只能被当前进程使用的局部变量。
例如,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 <stdlib.h> #include <stdio.h> 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 | 导出一个环境变量,使其成为可以被子进程使用的全局变量。 |