bash的各种文件载入执行顺序

  • A+
所属分类:成长之路

登录过的可交互 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 提示符即好看又实用。

  1. /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 赋值。

  1. ~/.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>
  1. ~/.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>
  1. ~/.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>
  1. ~/.bashrc 被非登录执行。 在终端里执行 bash,将会产生一个非登录shell,它会执行 .bashrc
~/.profile> bash

[注意: 下面显示的 PS1 来自 `.bashrc`。 ]
~/.bashrc> exit
exit

[注意: 从非登录 shell 里退出后,回到登录后的 shell]
~/.profile>

转载自http://jser.me/2016/09/29/bash%E7%9A%84%E5%90%84%E7%A7%8D%E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F.html

  • 我的微博
  • 这是我的微博扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

签到

目前评论:2   其中:访客  2   博主  0

    • avatar cjk. 5

      签到成功!签到时间:今日的下午4:43:23,每日打卡,生活更精彩哦!

      • avatar wanggege 2

        签到成功!签到时间:今日的下午9:27:45,每日打卡,生活更精彩哦!