第5章 Linux环境变量
5.1 什么是环境变量
环境变量(environment variable)这项特性允许你在内存中存储数据,以便程 序或shell中运行的脚本能够轻松访问到它们
Linux系统默认定义了一些标准的全局环境变量和局部环境变量
在bash shell中,环境变量分为两类:
- 全局变量
- 局部变量
5.1.1 全局环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的,这对那些所创建的子shell需要获取父shell信息的程序来说非常有用
printenv [变量名] //查看全局变量配置或个别环境变量的值
echo [$变量名] //显示变量的值,美元符($)不能省略
窍门 在变量名前加上美元符($)能够让变量作为命令行参数
例如:变量HOME的值为/home/Christine
命令行输入'ls $HOME'和输入'ls /home/Christine'的输出结果是一样的
5.1.2 局部环境变量
局部环境变量只能在定义它们的进程中可见,但它和全局变量一样重要
查看局部环境变量的列表有点复杂。遗憾的是,在Linux系统并没有一个只显示局部环境变量的命令
set //显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量
说明 命令env、printenv和set之间的差异很细微。set命令会显示出全局变量、局部变量以及用户定义变量,还会按照字母顺序对结果进行排序
5.2 设置用户定义变量
5.2.1 设置局部用户定义变量
可以通过等号给环境变量赋值,值可以是数值或字符串。如果要给变量赋一个含有空格的字符串值,必须用双引号来界定字符串的首和尾
记住,变量名、等号和值之间没有空格!!
[root@localhost ~]# echo $my_variable
[root@localhost ~]# my_variable="Hello World"
[root@localhost ~]# echo $my_variable
Hello World
窍门 所有的环境变量名均使用大写字母,这是bash shell的标准惯例。在涉及用户定义的局部变量时应坚持使用小写字母。变量名区分大小写
用户创建的局部变量只能在当前shell使用,在父shell或子shell中都不可用
5.2.2 设置全局环境变量
创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。这个过程通过export命令来完成,变量名前面不需要加 $
在设置全局环境变量时需注意两点:
- 修改子shell中全局环境变量并不会影响到父shell中该变量的值
- 子shell无法使用export命令改变父shell中全局环境变量的值
[root@localhost ~]# my_variable="I'm Global now" //定义变量
[root@localhost ~]# export my_variable //导出到全局环境
[root@localhost ~]# echo $my_variable
I'm Global now
[root@localhost ~]# bash //创建子shell
[root@localhost ~]# echo $my_variable
I'm Global now
[root@localhost ~]# my_variable="Null" //重新定义变量值
[root@localhost ~]# export my_variable
[root@localhost ~]# echo $my_variable
Null
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $my_variable
I'm Global now
从以上事例可以看到尽管子shell重新定义并导出了变量my_variable,但父shell中的my_variable变量依然保留着原先的值
5.3 删除环境变量
可以用unset命令删除环境变量,在unset命令中引用环境变量时不使用$
如果是在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用(和在子shell中修改环境变量类似,无法将效果反映到父shell中)
[root@localhost ~]# echo $my_variable
I'm Global now
[root@localhost ~]# unset my_variable
[root@localhost ~]# echo $my_variable
5.4 设置 PATH 环境变量
将目录加到PATH环境变量之后,就可以在虚拟目录结构中的任何位置执行程序(如果希望子shell也能找到你的程序的位置,一定要记得把修改后的PATH环境变量导出)
不过这种修改是暂时的,要想让环境变量效果持久化,可以把修改设置放在 $HOME/.bashrc启动文件中
[root@localhost ~]# test.txt
bash: test.txt: 未找到命令...
[root@localhost ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
[root@localhost ~]# PATH=$PATH:/home/test
[root@localhost ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:/home/test
[root@localhost ~]# test.txt
this is a test
5.5 定位系统环境变量
在登录Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作启动文件或环境文件。bash检查的启动文件取决于你启动 bash shell的方式(有3种):
- 登录时作为默认登录shell
- 作为非登录shell的交互式shell
- 作为运行脚本的非交互shell
5.5.1 登录shell
登录shell会从5个不同的启动文件里读取命令:
- /etc/profile //是系统上默认的bash shell的主启动文件,系统上每个用户登录时都会执行该文件
- $HOME/.bash_profile
- $HOME/.bashrc //该文件通常通过其他文件运行的
- $HOME/.bash_login
- $HOME/.profile
窍门 $HOME表示的是某个用户的主目录。它和波浪号(~)的作用一样
说明 要留意有些Linux发行版使用了
可拆卸式认证模块(Pluggable Authentication Modules, PAM)。在这种情况下,PAM文件会在bash shell启动之前处理,这些文件中可能会包含环境变量。PAM文件包括/etc/environment文件和$HOME/.pam_environment文件
5.5.2 交互式shell进程
如果你的bash shell不是登录系统时启动的(比如是在命令行提示符下敲入 bash时启动),那么你启动的shell叫作交互式shell。它就不会访问/etc/profile文 件,只会检查用户HOME目录中的.bashrc文件
.bashrc文件有两个作用:一是查看/etc目录下通用的bashrc文件,二是为用户提供一个定制自己的命令别名和私有脚本函数的地方
5.5.3 非交互式shell
系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符,但是当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令。为了处理这种情况,bash shell提供了BASH_ENV环境变量
5.6 数组变量
环境变量有一个很酷的特性就是,它们可以作为数组使用,值与值之间用空格分隔
[root@localhost ~]# mytest=(one two three four five)
[root@localhost ~]# echo $mytest
one
[root@localhost ~]# echo ${mytest[2]}
three
[root@localhost ~]# mytest[2]=seven
[root@localhost ~]# echo ${mytest[*]}
one two seven four five
[root@localhost ~]# unset mytest[2]
[root@localhost ~]# echo ${mytest[*]}
one two four five
[root@localhost ~]# echo ${mytest[2]} //删除的是值,但位置还在
[root@localhost ~]# echo ${mytest[3]}
four
5.7 小结
本章介绍了Linux的环境变量,在工作过程中建议还是边查阅资料边操作。
本章节涉及命令:env、printenv、set、echo、export、unset