我需要准确了解交互式登录 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
,将该行放在顶部。