jay*_*.sf 2 scripting bash ssh error-handling r
我在服务器上遇到 SSH 问题。运行单个脚本(源 s01.sh 等)工作正常,并在控制台中显示错误。但是,当使用主脚本获取这些脚本时,SSH 连接会在遇到错误时意外终止。主脚本master.sh如下:
#!/bin/bash
set -e
source s01.sh
source s02.sh
Rscript s03.R
source s04.sh
Run Code Online (Sandbox Code Playgroud)
我在交互式 SSH 会话中使用以下命令获取主脚本
source master.sh
Run Code Online (Sandbox Code Playgroud)
使用 set -e,我希望脚本在出现错误时停止,但相反,它导致整个 SSH 会话中断。这种情况仅发生在组合脚本中,而不会发生在单独采购中。为什么会发生这种情况?如何防止 SSH 会话因脚本错误而关闭?
我知道这可能涉及 SSH 服务器配置,但我不确定要调查哪些设置。
发生这种情况的原因是因为您正在采购主脚本。我可以使用这两个玩具示例重现您描述的行为:
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
Run Code Online (Sandbox Code Playgroud)
现在,如果我打开一个新终端并运行. ~/scripts/foo.sh(请注意,这source是标准命令的不可移植的 bash 别名.,因此. foo与 相同source foo),我打开的终端就会退出。如果我在 ssh 会话中尝试它,ssh 会话就会退出。为什么?因为采购意味着执行命令并将其应用到当前会话。因此,由于其中一个脚本导致错误(该命令false只是以 退出1),因此会set -e导致会话退出。它不仅仅会终止脚本,因为您已告诉它通过获取而不是执行来将命令应用到当前 shell 会话。
但是,从您的示例来看,您似乎不需要获取主脚本,您所需的只是获取其他脚本,这些脚本可能正在设置 R 脚本所需的环境。所以只要执行而不是采购,你应该没问题:
/path/to/master.sh
Run Code Online (Sandbox Code Playgroud)
或者,如果您尚未使其可执行:
bash /path/to/master.sh
Run Code Online (Sandbox Code Playgroud)
有关采购与执行的更多信息,请参阅这篇文章。