在我的脚本中,我需要处理管道的 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 命令的退出代码?
答案 0 :(得分:1)
Bash的set -o pipefail
使用第一个非零退出代码(如果有)作为管道的退出代码。
POSIX shell没有这样的功能AFAIK。您可以使用其他方法解决此问题:
tail -F -n0 real_work.log &
do_real_work > real_work.log 2>&1
kill $!
也就是说,在运行命令之前开始跟踪尚不存在的文件,并在运行命令后终止进程。