我在服务器上遇到 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
看这个帖子了解有关采购与执行的更多信息。