用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
!