首页 > 解决方案 > 如何在管道开始时检测错误?

问题描述

在我的脚本中,我需要处理管道的非最后一个命令的退出状态:

 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。

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

标签: shpipeline

解决方案


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

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

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

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


推荐阅读