初始化脚本在 SSH 上运行两次

初始化脚本在 SSH 上运行两次

运行 Ubuntu 12.04。

我有一个设置环境的脚本,它由/etc/bash.bashrc. (它可能被设置为由其他shell配置文件初始化运行,我实际上没有自己设置它)

当我Ctr+Alt+T打开终端时,脚本运行一次。但是如果我从另一个盒子通过 SSH 连接到我的机器,/etc/bash.bashrcinit 脚本就会运行,但随后它也会运行再次,我不知道为什么。

其他用户经历相同的“双重”初始化。这不一定是一个问题,但我真的想出于学术原因隔离这个问题。

我添加了一个回显,/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 之间的区别?

相关内容