You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测进程替换中的错误?内部进程退出状态能否捕获?

进程替换内部进程的非零退出状态捕获问题

先看测试代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:42:04