如何检测管道开头的错误?

How to detect an error at the beginning of a 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。

如何获取最近管道的非最后命令的退出代码?

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

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

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

即在运行命令之前开始跟踪还不存在的文件,在运行命令之后kill进程。