什么是环境变量
学习或使用Linux的时候,修改环境变量是经常遇到的,到底什么是环境变量?环境变量是bash shell的特性,用来存储有关shell会话和工作环境的信息。允许在内存中存储数据,以便运行在shell上的程序和脚本访问。这些数据可以是用来识别用户、系统、Shell的特性以及任何其它需要存储的数据。
环境变量的分类
在bash shell中,环境变量分为两类:
- 全局变量
- 局部变量
全局环境变量
全局变量不仅对shell会话可见,对所有shell创建的子进程也可见。查看全局变量可以是用printenv命令。
$ printenv
HOSTNAME=localhost.localhostdomain
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
……
局部环境变量
局部环境变量只能在定义它们的进程中可见。查看局部环境变量有点复杂,不像全局环境变量那样可以使用一个命令来只显示局部环境变量。set命令可以显示为某个特定进程设置的环境变量,也包括全局环境变量。
$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
......
定位系统环境变量
Linux系统用环境变量来在程序和脚本中标识它自己。这为程序提供了获得系统信息的一个简便方法。
当登录linux系统启动一个bashshell时,默认情况下,bash会在几个文件中查找命令,这些文件被称作启动文件。bash检查的启动文件取决于启动bash shell的方式。启动bash shell有3种方式:
- 登陆时当作默认登录shell
- 作为非登录shell的交互式shell
- 作为运行脚本的非交互式shell
登录shell
登录linux系统时,bashshell会作为登录shell启动。登录shell会从4个不同的启动文件里读取命令。下面是bash shell读取这些文件的顺序:
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bash_login
- $HOME/.profile
/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。另外3个启动文件是用户专有的,可以根据每个用户的需求具体定制。
/etc/profile
/etc/profile文件是bash shell的主启动文件。只要登录了Linux系统,bash就会执行/etc/profile文件中的命令。在这个文件中有一行:
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
这保证了/etc/profile文件中的环境变量对这个登录shell创建的所有子进程都有效。
其中还有个for循环,会逐一访问位于/etc/profile.d目录的每个文件,为Linux系统提供了一个集中存放用户登录时要执行的应用专属的启动文件的地方。基本上都是跟系统上的特定应用有关。大部分应用会创建两个启动文件:一个是bash shell(使用.sh扩展名),一个是c shell(使用.csh扩展名)。比如判定系统上所采用的默认语言字符集,然后正确地设置LANG环境变量的文件有lang.sh和lang.csh。
$HOME目录下的启动文件
这三个文件都起着同一个左右:为用户提供一个专属的文件来定义用户专有的环境变量。大多数Linux发行版只用这3个文件中的一个:
- $HOME/.bash_profile
- $HOME/.bash_login
- $HOME/.profile
这3个文件是以点开头的,说明是隐藏文件。它们在用户的HOME目录下。.bash_profile启动文件会先去检查HOME目录中是不是还有一个叫.bashrc的启动文件。如果有的话,启动文件会先去执行它里面的命令。
交互式shell
如果bash shell不是登录系统时启动的(比如,在命令行输入bash命令启动),启动的shell被称为交互式shell。
如果bash是作为交互式shell启动的,不会访问/etc/profile文件,而是会去HOME目录检查.bashrc是否存在。
.bashrc文件有两个作用:一是查看/etc目录下的共用bashrc文件,二是为用户提供一个定制自己命令别名和私有脚本函数的地方。
通用的/etc/bashrc启动文件会被系统上每个启动交互式shell会话的用户执行。但并没有实行export命令让它们成为全局环境变量。
交互式shell的启动文件只会在每次有新的交互式shell启动时才运行,因此任何子shell都会自动执行这个交互式shell的启动文件。
此外,/etc/bashrc也会执行位于/etc/profile.d目录下的哪些应用专属的启动文件。
非交互式shell
系统执行脚本是用的就是这种shell。不用担心没有命令行提示符,在系统上运行脚本时,仍要运行特定的启动命令。
为了处理这种情况,bashshell提供了BASH_ENV环境变量。当shell启动一个非交互式shell时,会检查这个环境变量来查看要执行的启动文件。如果有指定的,shell会执行文件里的命令。有的Linux发行版里,默认情况下这个环境变量并未设置。