如何不使用临时文件或命名管道,用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)
核心逻辑:
- 创建文件描述符
3,绑定到当前进程的stdout - 后台启动programC,让它从
fd3获取输入 - 运行programA,将其stderr重定向到
fd3(交给programC处理),stdout直接管道传给programB - 最后用diff对比programB的输出(管道到diff的stdin)和programC的输出(通过
<(cat)读取fd3内容)
内容的提问来源于stack exchange,提问作者bivoje
相关产品推荐
相关产品推荐

