Bash pipe:获取管道中前一个进程的退出状态
Posted
技术标签:
【中文标题】Bash pipe:获取管道中前一个进程的退出状态【英文标题】:Bash pipe: get the exit status of previous process in pipeline 【发布时间】:2021-01-16 20:42:52 【问题描述】:我正在编写一个记录器来捕获脚本的输出,并在前一个程序失败或成功时以不同方式处理该输出:
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 失败了”?
注意 program1 是通用的,我无法控制它。
想法:
program1 以非零状态退出时,logger.sh 端是否收到任何信号? 能否找到“program1”的 PID 并获取其退出状态? ...【问题讨论】:
logger.sh
还做其他事情吗?执行if output=$(program1); then echo "program1 has failed"; echo "$output"; fi
之类的操作会更简单,尽管使用文件系统比使用 shell 变量存储无限量的数据更合适。
回应@chepner 的评论,你能不能把用法改成logger.sh program1
这样脚本负责启动程序?这会让它更容易监控程序。
【参考方案1】:
我认为你可以通过这个实现你想要的:
program1 > program1.log || cat program1.log
rm program1.log
那么你根本不需要logger.sh
。
这会将program1
的stdout
重定向到program1.log
,如果program1
的退出代码不为零,则将打印program1.log
。之后,program1.log
被删除。
【讨论】:
以上是关于Bash pipe:获取管道中前一个进程的退出状态的主要内容,如果未能解决你的问题,请参考以下文章