2009-10-02 19 views
93

这是众所周知如何管一个进程的标准输出到另一个过程的标准输入:使用bash,我怎样才能将标准错误导入另一个进程?

proc1 | proc2 

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

proc1 2| proc2 

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

+0

您可以在'rc'中做这样一个简单的重定向,这是另一个shell。例如:'proc1 | [2] proc2'。这不是很好吗? 虽然不是'bash'。 – Rolf 2018-03-01 20:41:04

回答

75

您可以使用以下技巧交换stdoutstderr。然后您只需使用常规管道功能。

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

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

做些什么:

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

这是有效的,你看到的排序swap命令:

temp = value1; 
value1 = value2; 
value2 = temp; 
+3

在这里使用'1&2 -'而不是'1&2'的价值是什么?我不明白为什么我们想要关闭fd'2',如果我们要立即重新打开/重新分配。 – dubiousjim 2012-10-20 12:00:22

+1

@dubiousjim,在这种情况下没有任何优势,我怀疑我只是为了保持一致 - 关闭文件句柄3是释放它的好主意。 – paxdiablo 2012-10-20 12:21:59

+0

您可能忘记了&&以重点说明。 – ovgolovin 2013-06-27 14:26:18

56

击4有此功能:

如果`|使用'&'时,command1的标准错误通过管道连接到command2的标准输入;它是2> & 1 |的简写。这个标准错误的隐式重定向是在命令指定的任何重定向之后执行的。

zsh也有此功能。

-

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

FirstCommand 2> & 1 |其他命令

+11

从阅读文档,这不仅仅是标准错误*和*输出,而只是标准错误,但很高兴知道。我想,开始看bash 4的时候了。 – paxdiablo 2009-10-02 07:11:22

+0

当前bash手册中显示“如果使用|&,命令的 标准错误,**除标准输出外,**连接到command2的标准输入”。这显然不是OP想要的。 – 2017-06-21 14:37:52

+0

@ PeterA.Schneider:OP表示“将标准输出保留到当前位置”,这可能是不明确的。 – 2017-06-21 14:54:07

18

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

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

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

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

因为这会将所有内容重定向到/dev/null

108

还有process substitution。这使得一个过程替代了一个文件。
您可以发送stderr到一个文件,如下所示:

process1 2> file 

但是你可以为如下文件替换的过程:

process1 2> >(process2) 

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

sh myscript 2> >(tee -a errlog) 
+14

这正确地回答了所述的问题,应该是@paxdiablo接受的答案 – mmlb 2014-07-01 18:59:45

+0

我试过这个。它不起作用('weston --help 2>>(less)''),它打破了我的shell,我不得不退出并重新登录。 – Rolf 2018-03-01 20:47:49

相关问题