![](/img/trans.png)
[英]Getting exit status of command executed using exec of Net::SSH::Expect
[英]Exit status of a piped command executed over ssh
我正在通过ssh在bash中执行管道命令链。 如果任一命令失败,我想退出。 如果在整个管道完成执行后退出,也可以。 如果命令之一失败,我只想为管道分配总体“失败”状态。
一个最小的例子是:
ssh $REMOTE_HOST "CMD1 | CMD2" >> file.txt
如果管道中的任何一条命令失败,我将失败退出。 如果我在本地执行命令链,则可以使用${PIPESTATUS[0]}
提取链中任何命令的退出状态。 但是通过ssh,我得到了最后一条命令的退出状态。 即,如果CMD1
失败而CMD2
成功,则$?
在本地主机上给我0
。 如果CMD1
发生故障,如何为管道分配总体故障状态?
由于此问题被标记为bash
,因此我假设远程用户的默认外壳为Bash。 在这种情况下,您应该通过set -o pipefail
设置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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.