环境变量的本质就是变量,它的服务对象是shell程序,它分为局部环境变量和全局环境变量,分别有不同的作用域和自然生命周期
1.不同角色的shell
不同的情况下,会产生不同的shell。既然环境变量是服务于shell程序的,那么就来分析一下不同角色的shell
- 交互式shell:我们打开一个tty控制台,实际就打开了一个交互式shell。我们输入的bash命令就由交互式shell解析
- 非交互式shell:就是各种脚本程序
- 登录shell:登录系统后,首个执行的应用程序bash,该应用程序就称之为登录shell。登录shell执行后,才会由它陆续去执行其他的交互式shell,非交互式shell,可以认为它是所有shell的祖宗
2.全局环境变量
使用export导出的环境变量,就是全局环境变量
- 全局环境变量的作用域为:创建该全局环境变量的shell及其子孙shell/进程。即子shell复制父shell的全套环境变量,子shell对得到的环境变量做修改并不会影响到父shell
- 全局环境变量的自然生命周期为:创建该全局环境变量的shell死亡,并且其子孙shell/进程也全部死亡(通俗的来说,创建者的整个家族灭门了)
始祖环境变量
登录系统后,首个执行的应用程序bash(登录shell)所创建的一堆全局环境变量,它们称为始祖环境变量。这一堆环境变量的生命周期是永久的 启动shell会执行/etc/profile ,导出一些通用全局环境变量,export PATH USER LOGNAME MAIL HOSTNAME 等,所有用户的shell进程都可以访问到这些变量,我们可以在里面添加系统级别的环境变量。然后再依次执行~/.bash_profile、~/.bash_login、~/.profile或者~./bashrc,或者/etc/bashrc ,来初始化一些用户特有的环境变量,需要注意的是后面几个文件不一定都存在
常见需求:增加PATH
在/etc/profile 最后加上export PATH="/xxxx/xxx$PATH"
全局环境变量的一般使用方法
- 例一,比如在控制台(交互式shell)中输入
export AAA="123" ,那么今后在该控制台中,直接或间接执行的shell,都将继承该控制台(交互式shell)留下来的全局环境变量,包括加入的VAR="123" - 例二,有两个“非交互式shell”
a.sh 、b.sh ,a.sh 中执行了b.sh ,b.sh 中执行了export BBB="123" 。现在执行a.sh ,则b.sh 是其子shell,所以 BBB 这个环境变量对a.sh 起不了作用。再一次印证了全局环境变量只能由创建者shell传给子孙shell
3.局部环境变量
不使用export导出的环境变量,就是局部环境变量。它通常作为某个脚本(非交互式shell)自己的私有变量
- 局部环境变量的作用域为:仅仅创建者shell自己。其父shell、其子shell均无法访问
4.操作环境变量
- 脚本和控制台中皆可设置环境变量,方法如下,尤其要注意bash的语法中“=”两边不能有空格,变量值中间也不能有空格,有的话要用单引号围起来
test=123 #局部环境变量一般用小写
export TEST=123 #全局环境变量一般用大写
export MYNAME='XIAO BA WU' #变量值有空格,要用单引号围起来
export test #也可以这样把前面的局部变量导出到全局
- 我们可以输入下列命令来查看当前控制台(交互式shell)的环境变量
printenv #查看所有环境变量
echo $HOME #查看指定环境变量
- 我们可以这样取消当前控制台(交互式shell)环境变量
unset MYNAME
|