如何在管道开始时检测错误?

时间:2018-11-15 00:14:52

标签: sh pipeline

在我的脚本中,我需要处理管道的 non-last 命令的退出状态:

 do_real_work 2>&1 | tee real_work.log

令我惊讶的是,$?包含tee的退出代码。实际上,以下命令:

false 2>&1 | tee /dev/null ; echo $?

输出0。令人惊讶,因为csh(几乎)等效

false |& tee /dev/null ; echo $status

打印1。

如何获取最新管道的 non-last 命令的退出代码?

1 个答案:

答案 0 :(得分:1)

Bash的set -o pipefail使用第一个非零退出代码(如果有)作为管道的退出代码。

POSIX shell没有这样的功能AFAIK。您可以使用其他方法解决此问题:

tail -F -n0 real_work.log &
do_real_work > real_work.log 2>&1
kill $!

也就是说,在运行命令之前开始跟踪尚不存在的文件,并在运行命令后终止进程。