一、环境变量的种类

环境变量在Linux系统中的重要性不必多说,以下就以CentOS7为例,详细阐述系统的环境变量。当用户登录Linux系统启动一个bash shell时,系统默认会在几个文件中查找命令,这些文件就被称为环境文件。bash shell查找的环境文件取决于启动bash shell的方式。bash shell的启动方式可分为以下3种:
1. 用户登陆时作为默认登陆shell。
2. 作为非登陆shell的交互式shell(比如登陆后通过bash启动的子shell)。
3. 作为运行脚本的非交互shell。
以下就上述3种shell的环境变量文件查找进行详细说明。

二、3种shell的环境变量文件

1.登陆shell
当一个用户登陆Linux系统时,首先会检查/etc/profile文件(也会根据该文件的设置检查/etc/profile.d目录下的所有文件),/etc/profile文件是系统上默认的bash shell主启动文件,每个登录用户都会执行这个启动文件。
其次,会检查用户的专属启动文件,大多数Linux发行版只用到下面4个启动文件中的1~2个,这4个启动文件起到一个共同的作用:定义用户专属的环境变量。
(1) $HOME/.bash_profile
(2) $HOME/.bashrc
(3) $HOME/.bash_login
(4) $HOME/.profile
通常shell会按照下列顺序,找到第一个被找到的文件,余下的则会被忽略:
(1) $HOME/.bash_profile
(2) $HOME/.bash_login
(3) $HOME/.profile
可以发现,上述3个文件中并没有$HOME/.bashrc,这是因为该文件通常通过其他文件运行。

[root@host3 ~]# vim .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH 

可以看到$HOME/.bash_profile其实是读取了$HOME/.bashrc文件。
2.交互式shell进程
当你的shell不是登陆系统时启动的(比如在系统内输入bash命令启动的子shell),此时启动的shell则成为交互式shell,因为该shell同样可以提供一个命令提示符来输入命令。此时与登陆shell的区别在于:不会检查 /etc/profile文件和/etc/profile.d目录下的所有文件,只会按顺序检查
(1) $HOME/.bash_profile
(2) $HOME/.bash_login
(3) $HOME/.profile
通常情况下,只检查$HOME/.bashrc文件。
3.非交互式shell
系统在执行脚本时用到的就是这种shell,他没有命令提示符,bash会通过BASH_ENV环境变量来检查要启动的文件,但CentOS系统中默认该变量为空

[root@host3 ~]# echo $BASH_ENV [root@host3 ~]# 

此时的环境变量则为继承父shell的(脚本是当前shell中启动的一个子进程),需要注意的是:如果父shell中定义但未导出的环境变量属于局部变量,子shell不能继承。

三、总结

通过前文知道了环境变量文件启动的条件,通常情况下,个人永久环境变量存放在$HOME/.bashrc下,这一点适用于所有类型的shell进程;对于全局变量(所有linux用户都需要用到的变量)可以放在/etc/profile文件中,但建议存放在/etc/profile.d目录下一个以.sh结尾的文件中,它的好处是当系统版本升级时,/etc/profile文件会随之更新,定制的变量设置则会清空。