Linux 使用shell脚本从父脚本捕获通过ssh调用的子脚本的退出代码

Linux 使用shell脚本从父脚本捕获通过ssh调用的子脚本的退出代码,linux,shell,ssh,Linux,Shell,Ssh,我有一个名为deployment.sh的子脚本和名为deloy_base.sh的父脚本。从父deploy_base.sh,iam通过其他服务器上的ssh调用子脚本。实际上,子脚本正在执行部署过程。如果子脚本中的任何命令失败,则应将错误状态发送到父脚本,以便我可以根据子脚本中的成功或失败错误代码发送电子邮件 现在,不管子脚本中的任何命令失败,它总是会进入成功块。请帮忙 ssh user@10.0.0.1 "/home/scripts/deployment.sh" DEV 2>&1

我有一个名为deployment.sh的子脚本和名为deloy_base.sh的父脚本。从父deploy_base.sh,iam通过其他服务器上的ssh调用子脚本。实际上,子脚本正在执行部署过程。如果子脚本中的任何命令失败,则应将错误状态发送到父脚本,以便我可以根据子脚本中的成功或失败错误代码发送电子邮件

现在,不管子脚本中的任何命令失败,它总是会进入成功块。请帮忙

 ssh user@10.0.0.1 "/home/scripts/deployment.sh" DEV 2>&1  | tee /home/release/DEV.log
    if [ $? -ne 0 ]
    then
    `mail -s "DEPLOYMENT FAILED" -a /home/DEV.log
     -r "Deployment_Log@example.com" user@example.com > /dev/null 2>&1`
    else
   `mail -s "DEPLOYMENT SUCCESS" -a /home/DEV.log
     -r "Deployment_Log@example.com" user@example.com  > /dev/null 2>&1`
    Fi
manbash

管道的返回状态是最后一个命令的退出状态, 除非启用了pipefail选项。如果启用了pipefail,则 管道的返回状态是最后一个(最右边)命令的值 以非零状态退出,如果所有命令都成功退出,则为零

在您的情况下,
$?
tee
的退出状态,但是

set -o pipefail
解决了这个问题