我有一个Bash脚本,它产生一个巨大的 shell管道作为后台进程,然后生成通过命名管道与之通信的各种其他进程。 (听起来很复杂?好吧,它是!)它看起来像这样:
generate_stuff | tee >(process1) >(process2) | process3 | save_stuff &
脚本工作得很好但是......它没有正确处理错误。存在各种错误条件,这些错误条件可能导致管道中的一个或多个命令失败。目前,该脚本盲目地报告一切正常,实际上只有某些命令成功完成。
有什么方法可以检查所有命令是否以退出代码零结束?希望没有使这个巨大的脚本比现在更复杂......?
答案 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 -e
和set -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.