在bash中,cmd1如何?当cmd1失败时,cmd2返回cmd1的状态码?

时间:2016-02-27 23:06:25

标签: bash

简单示例:

user:/$ find /garbage | wc -l
find: '/garbage': No such file or directory
0
user:/$ echo $?
0

find失败,但wc执行且$?=0。我宁愿中止,并将$?设置为find的状态代码。

这似乎有效

user:/$ find /garbage 2> /dev/null && if [ ! $? -eq 0 ]; then exit $?; fi | wc -l
user:/$ echo ?
3

但它很笨重,感觉更像是一种更清洁,更全面的解决方案。

2 个答案:

答案 0 :(得分:4)

取自man bash

  

管道的返回状态是最后一个命令的退出状态,除非启用了 pipefail 选项。如果启用了pipefail,则管道的返回状态是最后一个的值(右 -          大多数)命令以非零状态退出,如果所有命令都成功退出,则返回零。如果保留字!在管道之前,该管道的退出状态是该管道的逻辑否定          退出状态如上所述。 shell在返回值之前等待管道中的所有命令终止。

设置它:set -o pipefail

答案 1 :(得分:4)

使用当前的GNU bash:

看看数组PIPESTATUS:

find /garbage | wc -l
echo "find:${PIPESTATUS[0]} wc:${PIPESTATUS[1]}"

输出:

find:1 wc:0