如何检测进程替换中的错误?内部进程退出状态能否捕获?
进程替换内部进程的非零退出状态捕获问题
先看测试代码:
cat < <( echo inside; exit 1; echo nomore; ) || echo error echo "${PIPESTATUS[*]}"
执行结果如下:
inside 0
核心原因
进程替换和管道的工作机制存在本质区别:
- 管道的
PIPESTATUS会跟踪每个管道段进程的退出状态,但进程替换本质是创建匿名管道供主进程读取,bash不会自动跟踪进程替换内部子进程的退出状态。 - 这里主进程仅跟踪直接调用的
cat命令状态:cat成功读取了子进程输出的inside内容(哪怕子进程中途执行exit 1,管道已有内容被读取),所以cat的退出状态为0,PIPESTATUS也只返回这一个值。
手动获取进程替换内的退出状态
并非完全无法获取,需要通过额外手段传递状态,比如借助临时文件:
# 创建临时文件存储退出状态 tmp_status=$(mktemp) # 进程替换内执行命令后,将退出状态写入临时文件 cat < <( echo inside; exit 1; echo "$?" > "$tmp_status"; ) # 读取临时文件中的状态 inner_exit=$(cat "$tmp_status") # 清理临时文件 rm "$tmp_status" echo "进程替换内部进程的退出状态:$inner_exit"
执行后即可拿到子进程的1这个退出状态。
内容的提问来源于stack exchange,提问作者Albert Camu
相关产品推荐
相关产品推荐

