运行 Ubuntu 12.04。
我有一个设置环境的脚本,它由/etc/bash.bashrc
. (它可能被设置为由其他shell配置文件初始化运行,我实际上没有自己设置它)
当我Ctr+Alt+T
打开终端时,脚本运行一次。但是如果我从另一个盒子通过 SSH 连接到我的机器,/etc/bash.bashrc
init 脚本就会运行,但随后它也会运行再次,我不知道为什么。
其他用户经历相同的“双重”初始化。这不一定是一个问题,但我真的想出于学术原因隔离这个问题。
我添加了一个回显,/etc/bash.bashrc
让我知道它何时执行。我第一次看到回声,但第二次没有看到回声,这让我相信有其他东西正在执行脚本,我只是不知道它是什么。我检查了~/.profile
, ~/.bashrc
, 和~/etc/profile
我应该强调的是,这种行为仅在用户通过 SSH 连接到计算机时才会发生。我知道交互式/登录/非登录 shell 之间存在一些区别,但我还不太清楚这个问题......
答案1
要弄清楚是什么在调用该环境设置脚本,您需要在该脚本中添加跟踪命令,而不是在您知道使用它的地方添加跟踪命令。
没有可移植的方法来报告 shell 脚本包含的堆栈。在bash中,你可以通过变量看到这一点BASH_SOURCE
。 Dash 在运行源脚本时保持源脚本打开,因此列出打开的文件应该会给您一个好主意。由于 bash 是默认的交互式 shell,而 dash 是默认的脚本 shell,因此这应该涵盖大多数情况。
if [ -n "$BASH_SOURCE" ]; then
eval 'echo "${BASH_SOURCE[@]}"'
else
readlink /proc/$$/fd/[4-9] 2>/dev/null
fi
(${BASH_SOURCE[@]}
被保护在后面,eval
因为这是 sh 中的语法错误。)
注意.bashrc
或者/etc/bash.bashrc
是环境变量的位置错误。它仅由 bash 的交互式非登录实例运行 - 特别是它不会针对 SSH 登录执行。如果/etc/bash.bashrc
针对 SSH 登录执行,则意味着另一个脚本(通常~/.bash_profile
)获取它。特定于站点的环境变量的正确位置是 中的脚本/etc/profile.d/
或 中的额外条目/etc/environment
。
关于登录 shell 和交互式 shell,请参阅登录 Shell 和非登录 Shell 之间的区别?