我正在通过ssh在bash中执行一个管道命令链。如果任何一个命令失败,我想退出。如果退出发生在整个管道完成执行后,它没关系。如果其中一个命令失败,我只想为管道分配一个整体“失败”状态。
最小的例子是:
ssh $REMOTE_HOST "CMD1 | CMD2" >> file.txt
如果管道中的任何一个命令失败,我想退出失败。如果我在本地执行命令链,我可以使用${PIPESTATUS[0]}
来取消链中任何命令的退出状态。但是通过ssh,我得到了最后一个命令的退出状态。即如果CMD1
失败并且CMD2
成功,则localhost上的$?
会给我0
。如果CMD1
失败,如何为管道分配整体失败状态?
答案 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。