通过ssh执行的管道命令的退出状态

时间:2015-04-07 22:47:44

标签: linux bash ssh

我正在通过ssh在bash中执行一个管道命令链。如果任何一个命令失败,我想退出。如果退出发生在整个管道完成执行后,它没关系。如果其中一个命令失败,我只想为管道分配一个整体“失败”状态。

最小的例子是:

ssh $REMOTE_HOST "CMD1 | CMD2" >> file.txt

如果管道中的任何一个命令失败,我想退出失败。如果我在本地执行命令链,我可以使用${PIPESTATUS[0]}来取消链中任何命令的退出状态。但是通过ssh,我得到了最后一个命令的退出状态。即如果CMD1失败并且CMD2成功,则localhost上的$?会给我0。如果CMD1失败,如何为管道分配整体失败状态?

1 个答案:

答案 0 :(得分:3)

由于此问题已标记为bash,因此我假设您的远程用户的默认shell是Bash。在这种情况下,您应该将the pipefail option设置为set -o pipefail。根据上面链接的Bash参考手册:

  

如果设置,管道的返回值是以非零状态退出的最后(最右边)命令的值,如果管道中的所有命令都成功退出,则返回零。默认情况下禁用此选项。

尝试,例如,

ssh $REMOTE_HOST 'false | true'
ssh $REMOTE_HOST 'set -o pipefail; false | true'

查看ssh命令的退出状态的差异。


另一方面,如果您的远程用户的默认shell是zsh,就像我一样,您应该使用setopt pipe_fail。请注意,这是zsh的一个相对较新的补充。我不能确定它何时被添加,但我知道它适用于5.0.5但不适用于5.0.2。