Shell脚本中嵌套HereDoc的返回状态捕获与主Shell退出问题
捕获嵌套HereDoc的命令返回状态并终止主Shell
你需要在嵌套HereDoc场景中捕获命令执行的返回状态,一旦命令失败就让主Shell退出,但当前脚本无法捕获command1的失败状态,导致后续command2仍会执行。这一需求完全可以实现,核心是要在每一层Shell中正确传递退出状态,以下是具体解决方案:
修改后的脚本示例
方式一:手动检查返回码
ssh username@<ip address> << EOF1 # 远程Shell执行su操作 su - user2 << EOF2 command1 # 内层检查command1的返回码,失败则退出user2的Shell if [ \$? -ne 0 ]; then exit 1 fi EOF2 # 远程Shell检查su命令的返回码,失败则退出远程Shell if [ \$? -ne 0 ]; then exit 1 fi command2 EOF1 # 本地主Shell检查ssh命令的返回码,失败则退出 if [ \$? -ne 0 ]; then exit 1 fi
方式二:使用set -e简化错误处理
set -e会让Shell在任何命令返回非零状态时直接退出,无需手动逐条检查,写法更简洁:
ssh username@<ip address> << EOF1 # 开启远程Shell的错误自动退出 set -e su - user2 << EOF2 # 开启user2 Shell的错误自动退出 set -e command1 EOF2 command2 EOF1 || exit 1
关键逻辑说明
su - user2的返回状态等于其HereDoc中最后一条命令的返回码,若开启set -e则是第一个失败命令的返回码,远程Shell可以通过$?捕获这个状态。ssh命令的返回状态等于远程Shell最终的退出码,本地主Shell只需检查ssh的返回码,就能判断远程是否有命令执行失败,进而决定是否退出。- 无论是手动检查
$?还是使用set -e,核心都是让错误状态从内层HereDoc逐层传递到外层,最终传递到本地主Shell。
内容的提问来源于stack exchange,提问作者Shubhro
相关产品推荐
相关产品推荐

