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

如何不使用临时文件或命名管道,用diff比较程序的stdout与stderr

如何在终端用diff比较单个程序的stdout和stderr(不使用临时文件/命名管道)

你的需求是让程序A的stdout经程序B处理、stderr经程序C处理,最后用diff对比两者的处理结果,且全程不使用临时文件或命名管道。

你提到的几种方案里,进程替换原本用于对比不同命令的stdout,但可以调整用法适配单程序的双流对比,以下是两种可行的bash实现方式:

方案1:基于进程替换(程序A执行两次)

这种写法简单直观,但如果程序A有副作用(比如修改文件、生成随机输出),两次执行可能导致结果不一致:

diff <(programA 2>&1 >/dev/null | programC) <(programA 2>/dev/null | programB)
  • <(programA 2>&1 >/dev/null | programC):把programA的stderr重定向到stdout,丢弃原stdout,再传给programC处理,作为diff的第一个输入源
  • <(programA 2>/dev/null | programB):丢弃programA的stderr,把原stdout传给programB处理,作为diff的第二个输入源

方案2:单次执行程序A(利用文件描述符分流)

如果必须确保programA只运行一次(避免副作用影响),可以通过bash的文件描述符重定向实现流分流,同时处理两个输出流:

{
  # 后台启动programC,让它从文件描述符3读取输入
  programC <&3 &
  pid_c=$!
  # 运行programA:将stderr导向fd3(传给programC),stdout直接传给programB
  programA 2>&3 | programB
  wait $pid_c
} 3>&1 | diff - <(cat)

核心逻辑:

  1. 创建文件描述符3,绑定到当前进程的stdout
  2. 后台启动programC,让它从fd3获取输入
  3. 运行programA,将其stderr重定向到fd3(交给programC处理),stdout直接管道传给programB
  4. 最后用diff对比programB的输出(管道到diff的stdin)和programC的输出(通过<(cat)读取fd3内容)

内容的提问来源于stack exchange,提问作者bivoje

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:03:35