用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) 
 你可以使用下面的技巧来交换 stdout和stderr 。 那么你只需使用常规的pipe道function。 
 ( proc1 3>&1 1>&2- 2>&3- ) | proc2 
 提供的stdout和stderr都指向同一个地方的开始,这会给你你所需要的。 
它能做什么:
-   
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 !