一, 环境变量的种类
环境变量在 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 文件会随之更新, 定制的变量设置则会清空.
来源: http://www.bubuko.com/infodetail-2862603.html