我正在通过ssh在bash中执行管道命令链。如果任一命令失败,我想退出。如果退出发生在整个管道完成执行之后,也可以。如果命令之一失败,我只想为管道分配总体“失败”状态。
一个最小的例子是:
ssh $REMOTE_HOST "CMD1 | CMD2" >> file.txt
如果管道中的任何一条命令失败,我将失败退出。如果我在本地执行命令链,则可以${PIPESTATUS[0]}
用来提取链中任何命令的退出状态。但是通过ssh,我得到了最后一条命令的退出状态。即如果CMD1
失败并CMD2
成功,则$?
在localhost上给我0
。如果CMD1
失败,如何为管道分配总体失败状态?
由于此问题已标记bash
,因此我假设远程用户的默认外壳为Bash。在这种情况下,你应该设置的pipefail
选项通过set -o pipefail
。根据上面链接的Bash参考手册:
如果设置,则管道的返回值是以非零状态退出的最后一个(最右边)命令的值,如果管道中的所有命令成功退出,则返回零。默认情况下禁用此选项。
尝试例如
ssh $REMOTE_HOST 'false | true'
ssh $REMOTE_HOST 'set -o pipefail; false | true'
查看ssh
命令退出状态的差异。
另一方面,如果远程用户的默认外壳程序是zsh
,就像我一样,则应setopt pipe_fail
改用。请注意,这是zsh的相对较新的功能。我不能确定何时添加它,但我知道它适用于5.0.5,但不适用于5.0.2。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句