Bash 管道:获取管道中前一个进程的退出状态

问题描述

我正在编写一个记录器来捕获脚本的输出,并在前一个程序失败或成功时以不同的方式处理该输出

program1 | logger.sh

logger.sh 中,我计划有如下内容

while IFS= read -r line; do
    CAPTURED_OUTPUT="$CAPTURED_OUTPUT\n$line"
done
if "program1 has Failed"; then
    echo "$CAPTURED_OUTPUT"
fi

如何知道在logger.sh中“program1 has Failed”?

注意 program1 是通用的,我无法控制它。

想法:

  • 当 program1 以非零状态退出时,logger.sh 端是否收到任何信号?
  • 我能否找到“program1”的 PID 并获取退出状态?
  • ...

解决方法

我认为你可以通过这个实现你想要的:

program1 > program1.log || cat program1.log
rm program1.log

那么您根本不需要 logger.sh

这会将 stdoutprogram1 重定向到 program1.log,如果 program1 的退出代码非零,则将打印 program1.log。之后,program1.log 被删除。