繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM