用bash,我怎么能把标准错误导入另一个进程?

众所周知,如何将一个过程的标准输出转换成另一个过程的标准input:

proc1 | proc2 

但是,如果我想将proc1的标准错误发送到proc2并将标准输出保留到当前位置呢? 你会认为bash会有一个命令:

 proc1 2| proc2 

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

还有stream程替代 。 这使得一个进程替代一个文件。
您可以将stderr发送到一个文件,如下所示:

 process1 2> file 

但是你可以用一个进程replace文件,如下所示:

 process1 2> >(process2) 

下面是一个具体的例子,将stderr发送到屏幕上并附加到日志文件中

 sh myscript 2> >(tee -a errlog) 

你可以使用下面的技巧来交换 stdoutstderr 。 那么你只需使用常规的pipe道function。

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

提供的stdoutstderr都指向同一个地方的开始,这会给你你所需要的。

它能做什么:

  • 3>&1创build一个新的文件句柄3 ,它被设置为当前的1 (原始标准输出),只是为了保存在某个地方。
  • 1>&2-设置标准输出到当前文件句柄2 (原始标准错误),然后closures2
  • 2>&3-设置stderr到当前文件句柄3 (原始stdout),然后closures3

这实际上是您在sorting中看到的交换命令:

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

Bash 4有这个function:

如果使用'&',则command1的标准错误通过pipe道连接到command2的标准input; 它是2>&1 |的简写。 标准错误的隐式redirect在命令指定的任何redirect之后执行。

zsh也有这个function。

与其他/更老的shell,只需明确input

FirstCommand 2>&1 | OtherCommand

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

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

该命令是至关重要的; 你不会想要的:

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

因为这将redirect到/dev/null