获取多个子脚本时,由于脚本错误而导致 SSH 会话终止

获取多个子脚本时,由于脚本错误而导致 SSH 会话终止

我在服务器上遇到 SSH 问题。运行单个脚本(源 s01.sh 等)工作正常,并在控制台中显示错误。但是,当使用主脚本获取这些脚本时,SSH 连接会在遇到错误时意外终止。主脚本master.sh如下:

#!/bin/bash
set -e

source s01.sh
source s02.sh
Rscript s03.R
source s04.sh

我在交互式 SSH 会话中使用以下命令获取主脚本

source master.sh

使用 set -e,我希望脚本在出现错误时停止,但相反,它导致整个 SSH 会话中断。这种情况仅发生在组合脚本中,而不会发生在单独采购中。为什么会发生这种情况?如何防止 SSH 会话因脚本错误而关闭?

我知道这可能涉及 SSH 服务器配置,但我不确定要调查哪些设置。

答案1

发生这种情况的原因是因为您正在采购主脚本。我可以使用这两个玩具示例重现您描述的行为:

terdon@oregano ~ $ cat ~/scripts/foo.sh
#!/bin/bash
set -e
source /home/terdon/scripts/bar.sh
echo "done!"

terdon@oregano ~ $ cat ~/scripts/bar.sh
#!/bin/bash

echo "start"
false

现在,如果我打开一个新终端并运行. ~/scripts/foo.sh(请注意,这source是标准命令的不可移植的 bash 别名.,因此. foo与 相同source foo),我打开的终端就会退出。如果我在 ssh 会话中尝试它,ssh 会话就会退出。为什么?因为采购意味着执行命令并将其应用到当前会话。因此,由于其中一个脚本导致错误(该命令false只是以 退出1),因此set -e会导致会话退出。它不仅仅会终止脚本,因为您已告诉它通过获取而不是执行来将命令应用到当前 shell 会话。

但是,从您的示例来看,您似乎不需要获取主脚本,您所需的只是获取其他脚本,这些脚本可能正在设置 R 脚本所需的环境。所以只要执行而不是采购,你应该没问题:

/path/to/master.sh

或者,如果您尚未使其可执行:

bash /path/to/master.sh

这个帖子了解有关采购与执行的更多信息。

相关内容