[翻译]bash的各种文件载入执行顺序
[注] 一直以来都没有搞清楚 bash
里各种文件的载入顺序,这是一篇好文,顺手翻译一下。
这篇文章解释了下面这些文件载入执行的顺序:
- /etc/profile
- ~/.bash_profile
- ~/.bashrc
- ~/.bash_login
- ~/.profile
- ~/.bash_logout
登录过的可交互 shell 的执行顺序
下面的伪代码解释了这些文件的执行顺序
execute /etc/profile
IF ~/.bash_profile exists THEN
execute ~/.bash_profile
ELSE
IF ~/.bash_login exist THEN
execute ~/.bash_login
ELSE
IF ~/.profile exist THEN
execute ~/.profile
END IF
END IF
END IF
退出 shell 的时候,按照下面的执行顺序:
IF ~/.bash_logout exists THEN
execute ~/.bash_logout
END IF
需要注意的是 /etc/bashrc
是像下面这样被 ~/.bashrc
调用执行的:
# cat ~/.bashrc
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
非登录的可交互 shell 的执行顺序
当运行一个没有登录的可交互 shell 的时候,下面是它的执行顺序:
IF ~/.bashrc exists THEN
execute ~/.bashrc
END IF
注意: 当一个非登录的可交互 shell 启动的时候,它会查找 ENV 环境变量,然后执行 ENV 环境变量标识的文件名
测试执行顺序
测试执行顺序的一个方法是给这些文件添加不同的 PS1 值,然后重新登录 shell,看看都有哪些值被显示出来。我们之前有讨论过如何使用 PS1 来使你的 Linux 提示符即好看又实用。
- /etc/profile 被执行。 添加下面的 PS1 行到
/etc/profile
然后重新登录,确保提示符已经变成了这个文件里设置的样子。
# grep PS1 /etc/profile
PS1="/etc/profile> "
[Note: re-login to see the prompt change as shown below]
Last login: Sat Sep 27 16:43:57 2008 from 192.168.1.2
/etc/profile>
为了保证正常执行,需要确保 ~/.bash_profile
里没有别的 PS1 赋值。
- ~/.bash_profile 被执行: 添加下面的 PS1 到 ~/.bash_profile, ~/.bash_login, ~/.profile and ~/.bashrc。 重新登录一下,确认提示符像下面这样变成了
~/.bash_profile
里设置的内容。
/etc/profile> grep PS1 ~/.bash_profile
export PS1="~/.bash_profile> "
/etc/profile> grep PS1 ~/.bash_login
export PS1="~/.bash_login> "
/etc/profile> grep PS1 ~/.profile
export PS1="~/.profile> "
/etc/profile> grep PS1 ~/.bashrc
export PS1="~/.bashrc> "
[注意: 由于重新登录, 先执行 /etc/profile 然后 ~/.bash_profile。
所以 PS1 会是 ~/.bash_profile 里设置的.
由于 ~/.bash_profile 的存在, 它不会执行 ~/.bash_login ]
Last login: Sat Sep 27 16:48:11 2008 from 192.168.1.2
~/.bash_profile>
- ~/.bash_login 被执行。 把
.bash_profile
重命名一下。重新登录确认提示符像下面这样变成~/.bash_login
里设置的。
~/.bash_profile> mv .bash_profile bash_profile_not_used
[注意: 由于重新登录,它先执行 `/etc/profile`。
同时由于找不到 `~/.bash_profile`, 它执行 `~/.bash_login`]
Last login: Sat Sep 27 16:50:55 2008 from 192.168.1.2
~/bash_login>
- ~/.profile 被执行。重命名
.bash_login
。重新登录确认提示符像下面这样变成了~/.profile
里设置的。
~/.bash_login> mv .bash_login bash_login_not_used
[注意: 由于重新登录,它先执行 `/etc/profile`。
同时由于找不到 `~/.bash_profile` 和 `~/.bash_login`, 它执行 `~/.profile`]
Last login: Sat Sep 27 16:56:36 2008 from 192.168.1.2
~/.profile>
- ~/.bashrc 被非登录执行。 在终端里执行
bash
,将会产生一个非登录shell,它会执行.bashrc
。
~/.profile> bash
[注意: 下面显示的 PS1 来自 `.bashrc`。 ]
~/.bashrc> exit
exit
[注意: 从非登录 shell 里退出后,回到登录后的 shell]
~/.profile>