监控管道退出代码

时间:2013-11-29 17:28:53

标签: bash

我有一个Bash脚本,它产生一个巨大的 shell管道作为后台进程,然后生成通过命名管道与之通信的各种其他进程。 (听起来很复杂?好吧,它是!)它看起来像这样:

generate_stuff | tee >(process1) >(process2) | process3 | save_stuff &

脚本工作得很好但是......它没有正确处理错误。存在各种错误条件,这些错误条件可能导致管道中的一个或多个命令失败。目前,该脚本盲目地报告一切正常,实际上只有某些命令成功完成。

有什么方法可以检查所有命令是否以退出代码零结束?希望没有使这个巨大的脚本比现在更复杂......?

2 个答案:

答案 0 :(得分:3)

您使用$PIPESTATUS:“数组变量保存最后执行的前台管道的退出状态。”查看更多详情here

$ echo ok | tee | grep ko | cat
$ echo ${PIPESTATUS[@]}
0 0 1 0

对于背景管道,您可以尝试

$ ( echo ok | tee | grep ko | cat ; echo ${PIPESTATUS[@]} ) &
[1] 16660
0 0 1 0
[1]+  Done                    ( echo ok | tee | grep ko | cat; echo ${PIPESTATUS[@]} )

答案 1 :(得分:2)

您可能正在寻找set -eset -o pipefail

来自Bash手册:

pipefail     If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands in the pipeline exit successfully. This option is disabled by default.