简单示例:
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
但它很笨重,感觉更像是一种更清洁,更全面的解决方案。
答案 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