我想对特定命令的stdout和stderr执行不同的操作。
cmd |1 stdout_1 | stdout_2 |2 stderr_1 | stderr_2
其中stdout_x是专门用于stdout的命令,stderr_x是专门用于stderr的命令。如果 every 命令中的stderr通过管道传输到我的stderr命令中,这是可以的,但如果stderr可以严格地来自cmd,那就更好了。我一直在搜索一些可能支持这种做法的语法,但似乎找不到任何东西。
cmd
ymzxtsji1#
您可以使用不同的文件描述符:
{ 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
将stdout和stderr分别从cmd中通过管道传输。
ryhaxcpt2#
您可以使用进程替换和重定向来实现此目的:
cmd 2> >(stderr_1 | stderr_2) | stdout_1 | stdout_2
cdmah0mi3#
最直接的解决方案是这样的:
(cmd | gets_stdout) 2>&1 | gets_stderr
主要的缺点是如果gets_stdout本身在stdout上有任何输出,那么它也会输出到gets_stderr,如果这是一个问题,你应该使用anubhava或Kevin的答案。
gets_stdout
gets_stderr
nimxete24#
late-answer-和之前所有的答案一样,stderr在最后到达stdout(@anubhava的答案 * 几乎 * 完成)。要独立地(或相同地)传输stderr和stdout并将它们保存在stdout和stderr中,我们可以使用文件描述符。
{ { cmd | stdout_pipe ; } 2>&1 1>&3 | stderr_pipe; } 1>&2 3>&1
使用指令= { echo 'out'; echo >&2 'error'; }标准输出管道= awk '{print "stdout: " $0}'标准错误_管道= awk '{print "stderr: " $0}'
{ echo 'out'; echo >&2 'error'; }
awk '{print "stdout: " $0}'
awk '{print "stderr: " $0}'
{ { { echo 'out'; echo >&2 'error'; } \ | awk '{print "stdout: " $0}'; } 2>&1 1>&3 \ | awk '{print "stderr: " $0}'; } 1>&2 3>&1
{ }
当使用此函数重定向脚本的输出时,或者将此函数与着色stderr的终端一起使用时,您会看到不同之处。
4条答案
按热度按时间ymzxtsji1#
您可以使用不同的文件描述符:
否则使用进程替换:
将stdout和stderr分别从
cmd
中通过管道传输。ryhaxcpt2#
您可以使用进程替换和重定向来实现此目的:
cdmah0mi3#
最直接的解决方案是这样的:
主要的缺点是如果
gets_stdout
本身在stdout上有任何输出,那么它也会输出到gets_stderr
,如果这是一个问题,你应该使用anubhava或Kevin的答案。nimxete24#
late-answer-和之前所有的答案一样,stderr在最后到达stdout(@anubhava的答案 * 几乎 * 完成)。
要独立地(或相同地)传输stderr和stdout并将它们保存在stdout和stderr中,我们可以使用文件描述符。
使用
指令=
{ echo 'out'; echo >&2 'error'; }
标准输出管道=
awk '{print "stdout: " $0}'
标准错误_管道=
awk '{print "stderr: " $0}'
{ }
,用于将两个echo命令"组合"为一个命令当使用此函数重定向脚本的输出时,或者将此函数与着色stderr的终端一起使用时,您会看到不同之处。