我想对特定命令的stdout和stderr做不同的事情。像
这样的东西cmd |1 stdout_1 | stdout_2 |2 stderr_1 | stderr_2
其中stdout_x是专门用于stdout的命令,而stderr_x专门用于stderr。如果来自每个命令的stderr被传送到我的stderr命令中,那就没关系了,但如果stderr可以严格来自cmd
,那就更好了。我一直在寻找可能支持此功能的语法,但我似乎找不到任何东西。
答案 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的答案。