在登录 Linux 系统并启动一个 bash shell 时,默认情况下 bash 会在若干个文件中查找 环境变量 的设置。这些文件统称为系统环境文件。bash 检查的环境变量文件的情况取决于系统运行的 shell 方式。
在启动时,Linux 会加载一些系统的配置文件,这些配置文件主要涉及到 /etc/profile、./bash_profile、./bash_rc、/etc/bashrc 和 /etc/profile.d/ 等。
配置文件 | 描述 |
---|---|
/etc/profile | 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从 /etc/profile.d 目录的配置文件中搜集 shell 的设置。 |
/etc/bashrc | 为每一个运行 bash shell 的用户执行此文件,当 bash shell 被打开时,该文件被读取。 |
~/.bash_profile | 每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的 .bashrc 文件。 |
~/.bashrc | 该文件包含专用于你的 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该该文件被读取。 |
~/.bash_logout | 当每次退出系统(退出bash shell)时,执行该文件。另外,/etc/profile 中设定的变量(全局)的可以作用于任何用户,而 ~/.bashrc 等中设定的变量(局部)只能继承 /etc/profile 中的变量,他们是 “父子” 关系。 |
~/.bash_profile | 是交互式、login 方式进入 bash 运行的。 |
在我们登录 Linux 时,有三种登录方式,即,通过系统用户登录默认运行的 shell 登录、非登录交互式运行 shell 以及执行脚本运行非交互式 shell。
当用户登录 linux 时,shell 会作为登录 shell 启动。此时的登录 shell 加载环境变量的顺序如图所示:
用户登录系统后首先会加载 /etc/profile 全局环境变量文件,这是 Linux 系统上默认的 shell 主环境变量文件。系统上每个用户登录后都会加载这个文件。
当加载完 /etc/profile 文件后,才会执行 /etc/profile.d 目录下的脚本文件,这个目录下脚本有很多。
之后开始运行 $HOME/.bash_profile(用户环境变量文件),在这个文件中,又会去找 $HOME/.bashrc(用户环境变量文件),如果有,则执行 ,如果没有,则不执行。
在 $HOME/.bashrc 文件中又会去找 /etc/bashrc(全局环境变量文件),如果有,则执行 ,如果没有,则不执行。
如果用户的 shell 不是登录时启动的(比如手动敲下 bash 时启动或者其他不需要输入密码的登录以及远程 ssh 链接情况),那么这种非登录 shell 只会加载 $HOME/.bashrc(用户环境配置文件),并会去找 /etc/bashrc(全局环境变量文件)。
因此如果希望在非登录 shell 下也可读到设置的环境变量等内容,就需要将变量设定等写入 $HOME/.bashrc 或者 /etc/bashrc,而不是 $HOME/.bash_profile 或者 /etc/profile。
通过在不同的配置文件里面写入不同的内容,最终看输出的顺序。
我们首先,使用 vim 命令打开 environment 文件,并写入内容,具体命令如下:
vim /etc/environment
按下回车,并输入内容,如下图所示:
即,我们使用了 echo 命令,在其被加载的时候输出了一句话,同样,我们修改 profile 配置文件,具体命令如下:
vim /etc/profile
按下回车,并输入内容,如下图所示:
再次,我们修改 bash.bashrc 配置文件,具体命令如下:
vim /etc/bash.bashrc
按下回车,并输入内容,如下图所示:
再次,我们修改 profile.d/ 配置文件,具体命令如下:
vim /etc/profile.d/test.sh
按下回车,并输入内容,如下图所示:
再次,我们修改 .profile 配置文件,具体命令如下:
vim ~/.profile
按下回车,并输入内容,如下图所示:
再次,我们修改 .bashrc 配置文件,具体命令如下:
vim ~/.bashrc
按下回车,并输入内容,如下图所示:
现在,我们重新使用 ssh 登录,我们看到,此时输出如下:
即,我们通过在不同的配置文件里面写入不同的内容,测试了配置文件的加载顺序。
比如使用 ssh 登录,读取顺序为:
/etc/profile -> (~/.bash_profile, ~/.bash_login, ~/.profile)
non-login 登录方式有:screen 命令,bash 命令,su 切换用户,从图形界面打开 teminal 等,加载顺序为:
Ubuntu:/etc/bash.bashrc -> ~/.bashrc Red Hat:~/.bashrc
上述的读取顺序都是系统规定,不会被改变的顺序,但很多情况下,一个配置文件里还会读取另一些配置文件。例如,/etc/profile 中会有一段命令会执行 /etc/profile.d/*.sh 里的脚本。
Ubuntu下 的 /etc/profile 还会去执行 /etc/bash.bashrc,Red Hat 下的 ~/.bash_profile 会去执行 /.bashrc,/.bashrc 会去执行 /etc/bashrc。