pax*_*blo 124 bash pipe stderr
众所周知如何将流程的标准输出管道传输到另一个流程标准输入:
proc1 | proc2
Run Code Online (Sandbox Code Playgroud)
但是如果我想将proc1的标准错误发送到proc2并将标准输出保留到当前位置呢?你会认为bash
会有一个命令:
proc1 2| proc2
Run Code Online (Sandbox Code Playgroud)
但是,唉,没有.有没有办法做到这一点?
小智 154
还有流程替代.这使得进程替代文件.
您可以stderr
按如下方式发送到文件:
process1 2> file
Run Code Online (Sandbox Code Playgroud)
但您可以将进程替换为该文件,如下所示:
process1 2> >(process2)
Run Code Online (Sandbox Code Playgroud)
这是一个发送stderr
到屏幕并附加到日志文件的具体示例
sh myscript 2> >(tee -a errlog)
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 88
你可以使用以下技巧来交换 stdout
和stderr
.然后你只需使用常规管道功能.
( proc1 3>&1 1>&2- 2>&3- ) | proc2
Run Code Online (Sandbox Code Playgroud)
提供stdout
并且stderr
在开始时指向同一个地方,这将为您提供所需.
什么是x>y
位确实是改变文件句柄x
,因此现在将其信息发送到文件句柄y
当前点.对于我们的具体情况:
3>&1
创建一个新的句柄3
,它将输出到当前句柄1
(原始标准输出),只是为了保存它在下面的最后一个项目点.1>&2
修改句柄1
(stdout)以输出到当前句柄2
(原始stderr).2>&3-
修改句柄2
(stderr)以输出到当前句柄3
(原始标准输出)然后关闭句柄3
(通过-
最后).它实际上是您在排序算法中看到的交换命令:
temp = value1;
value1 = value2;
value2 = temp;
Run Code Online (Sandbox Code Playgroud)
Pau*_*ce. 66
Bash 4有这个功能:
如果使用`|&',则command1的标准错误通过管道连接到command2的标准输入; 它是2>&1 |的简写.在命令指定的任何重定向之后执行标准错误的隐式重定向.
zsh也有这个功能.
-
对于其他/旧shell,只需明确输入
FirstCommand 2>&1 | OtherCommand
kcc*_*qzy 27
交换非常好,因为它解决了这个问题.如果您甚至不需要原始标准输出,您可以这样做:
proc1 2>&1 1>/dev/null | proc2
Run Code Online (Sandbox Code Playgroud)
订单至关重要; 你不会想要:
proc1 >/dev/null 2>&1 | proc1
Run Code Online (Sandbox Code Playgroud)
因为这会将所有内容重定向到/dev/null
!
归档时间: |
|
查看次数: |
56168 次 |
最近记录: |