我正在通过 ssh 在 bash 中执行管道命令链。如果任何一个命令失败,我想退出。如果在整个管道完成执行后退出,那没关系。如果命令之一失败,我只想为管道分配一个整体“失败”状态。
一个最小的例子是:
ssh $REMOTE_HOST "CMD1 | CMD2" >> file.txt 
如果管道中的任何一个命令失败,我想退出并失败。如果我在本地执行命令链,我可以${PIPESTATUS[0]}用来提取链中任何命令的退出状态。但是通过 ssh,我得到了最后一个命令的退出状态。即如果CMD1失败并CMD2成功,$?在本地主机上给我0. 如果CMD1失败,如何为管道分配整体失败状态?
由于这个问题被标记为bash,我假设您的远程用户的默认 shell 是 Bash。在这种情况下,你应该设置的pipefail选项通过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。