使用bash,我怎么能管标准错误到另一个进程?(With bash, how can I pipe

2019-07-20 12:38发布

这是众所周知如何管一个进程的标准输出到另一个过程的标准输入:

proc1 | proc2

但是,如果我要发送PROC1的标准误差PROC2并保留标准输出将其当前位置? 你可能会认为bash将有沿行的命令:

proc1 2| proc2

但是,唉,没有。 有没有办法做到这一点?

Answer 1:

还有进程替换 。 这对于一个文件的过程替代。
您可以发送stderr到一个文件,如下所示:

process1 2> file

但是,您可以替换过程如下文件:

process1 2> >(process2)

这里是发送一个具体的例子stderr到两个屏幕和附加到一个日志文件

sh myscript 2> >(tee -a errlog)


Answer 2:

您可以使用下面的技巧来交换 stdoutstderr 。 然后你只需要使用普通管的功能。

( proc1 3>&1 1>&2- 2>&3- ) | proc2

提供的stdoutstderr在一开始都显示出相同的地方,这会给你所需要的。

什么是x>y位确实是改变文件句柄x所以,现在将其信息发送到文件句柄y当前点。 对于我们的具体情况:

  • 3>&1创建一个新的手柄3 ,其将输出到当前把手1 (原有的stdout),只是为了某处它保存为低于最终项目符号点。
  • 1>&2修改处理1 (标准输出),以输出到当前把手2 (原始标准错误)。
  • 2>&3-修改处理2 (错误),以输出到当前把手3 (原始的stdout)然后关闭处理3 (通过-在后)。

这是有效的,你的排序算法见swap命令:

temp   = value1;
value1 = value2;
value2 = temp;


Answer 3:

击4具有这样的特征:

如果`|&”时,命令1的标准误差被连接到通过所述管命令2的标准输入; 它是简写2>&1 |。 由该命令所指定的任何重定向之后执行这种隐含的标准误差的重定向。

zsh中也有这个功能。

-

与其他/旧的贝壳,刚进入这个明确的

FirstCommand 2>&1 | OtherCommand



Answer 4:

交换是伟大的,因为它解决了这个问题。 万一你甚至不需要原来的标准输出,你可以这样来做:

proc1 2>&1 1>/dev/null | proc2

顺序是非常重要; 你不会想:

proc1 >/dev/null 2>&1 | proc1

由于这将重定向一切/dev/null



Answer 5:

这些都不真的工作非常出色。 我发现你做你想要的最好的办法是:

(command < input > output) 2>&1 | less

这仅适用于其中的情况下command不需要键盘输入。 例如:

(gzip -d < file.gz > file) 2>&1 | less

会把gzip的错误少成



文章来源: With bash, how can I pipe standard error into another process?
标签: bash pipe stderr