管道stderr和stdout分开

时间:2014-12-28 04:00:05

标签: bash shell

我想对特定命令的stdout和stderr做不同的事情。像

这样的东西
cmd |1 stdout_1 | stdout_2 |2 stderr_1 | stderr_2

其中stdout_x是专门用于stdout的命令,而stderr_x专门用于stderr。如果来自每个命令的stderr被传送到我的stderr命令中,那就没关系了,但如果stderr可以严格来自cmd,那就更好了。我一直在寻找可能支持此功能的语法,但我似乎找不到任何东西。

3 个答案:

答案 0 :(得分:4)

您可以使用不同的文件描述符

{ cmd 2>&3 | stdout_1; } 3>&1 1>&2 | stderr_1

示例:

{ { echo 'out'; echo >&2 'error'; } 2>&3 | awk '{print "stdout: " $0}'; } 3>&1 1>&2 |
  awk '{print "stderr: " $0}'
stderr: error
stdout: out

或者使用流程替换

cmd 2> >(stderr_1) > >(stdout_1)

示例:

{ echo 'out'; echo >&2 'error'; } 2> >(awk '{print "stderr: " $0}') \
> >(awk '{print "stdout: " $0}')
stderr: error
stdout: out

从您的cmd分别管道stdout和stderr

答案 1 :(得分:3)

您可以使用进程替换和重定向来实现此目的:

cmd 2> >(stderr_1 | stderr_2) | stdout_1 | stdout_2

答案 2 :(得分:0)

最直接的解决方案是这样的:

(cmd | gets_stdout) 2>&1 | gets_stderr

主要缺点是,如果gets_stdout本身在stdout上有任何输出,那么它也会转到gets_stderr。如果这是一个问题,你应该使用anubhava或Kevin的答案。