了解 Bash 脚本顺序

了解 Bash 脚本顺序

我需要准确了解交互式登录 shell 中脚本的运行顺序。我“认为”它的运行顺序如下,但我不确定它的准确性,希望有人确认正确的顺序:

1./etc/profile , which then executes scripts in /etc/profile.d/*
2./etc/profile then executes ~/.bash_profile
3.~.bash_profile then invokes ~./bashrc
4.~/.bashrc then loads /etc/bash.bashrc

其次,我希望有人确认在交互式非登录 shell 中运行 bash 脚本的顺序。到目前为止,我已将其记为:

1.~/.bashrc , which then loads /etc/bash.bashrc

注意:虽然之前在这个论坛上已经问过类似的问题,但是那些答案并没有深入到我想要回答的程度(它们通常在谈到加载 .bash_profile 之后就停止了)

答案1

我不会直接回答,但会给你提供寻找答案的工具。

第一的,你需要阅读狂欢man 页面,或者你的 shell man 页面。这将明确地告诉你配置脚本的运行顺序,是否是登录,是否是交互式 shell,等等...

第二,你总是可以通过自己试验找到它。在每个脚本中,你可以运行任何你喜欢的命令。例如,你可以自己添加一行

echo "$$: Inside /etc/profile" >> /tmp/test_for_unstanding_bash_script_order.log

/etc/profile例如里面的。$$代表正在运行的 shell 的 PID。

然后,通过更改写入日志的字符串对所有其他文件执行相同操作。

然后你去看看里面日志档案这些行是按照什么顺序排列的。

然后你必须撤消你的更改。

当我添加这几行时,我得到了以下结果:

对于登录 shell:

8724: Inside /etc/bash.bashrc
8724: Inside /etc/profile.d/01-locale-fix.sh
8724: Inside /etc/profile.d/apps-bin-path.sh
8724: Inside /etc/profile.d/bash_completion.sh
8724: Inside /etc/profile.d/cedilla-portuguese.sh
8724: Inside /etc/profile.d/vte-2.91.sh
8724: Inside /etc/profile.d/xdg_dirs_desktop_session.sh
8724: Inside /etc/profile
8724: Inside ~/.bashrc

注意:我在每个文件的末尾都添加了 echo 行。这可能会导致错误的顺序。尤其是在 中/etc/profile。因此,在 中/etc/profile,将该行放在顶部。

相关内容