这是众所周知如何管一个进程的标准输出到另一个过程的标准输入:使用bash,我怎样才能将标准错误导入另一个进程?
proc1 | proc2
但是,如果我要发送PROC1的标准误差PROC2并保留标准输出将其当前什么位置?你会认为bash
会有一条命令:
proc1 2| proc2
但是,唉,没有。有没有办法做到这一点?
这是众所周知如何管一个进程的标准输出到另一个过程的标准输入:使用bash,我怎样才能将标准错误导入另一个进程?
proc1 | proc2
但是,如果我要发送PROC1的标准误差PROC2并保留标准输出将其当前什么位置?你会认为bash
会有一条命令:
proc1 2| proc2
但是,唉,没有。有没有办法做到这一点?
您可以使用以下技巧交换stdout
和stderr
。然后您只需使用常规管道功能。
(proc1 3>&1 1>&2- 2>&3-) | proc2
提供stdout
和stderr
都指向同一个地方,在开始时,这会给你所需要的。
做些什么:
3>&1
创建一个新的文件句柄3
被设置为当前1
(原标准输出),只是为了保存到某个地方。1>&2-
将stdout设置为当前文件句柄2
(原始stderr),然后关闭2
。2>&3-
将stderr设置为当前文件句柄3
(原始标准输出),然后关闭3
。这是有效的,你看到的排序swap命令:
temp = value1;
value1 = value2;
value2 = temp;
在这里使用'1&2 -'而不是'1&2'的价值是什么?我不明白为什么我们想要关闭fd'2',如果我们要立即重新打开/重新分配。 – dubiousjim 2012-10-20 12:00:22
@dubiousjim,在这种情况下没有任何优势,我怀疑我只是为了保持一致 - 关闭文件句柄3是释放它的好主意。 – paxdiablo 2012-10-20 12:21:59
您可能忘记了&&以重点说明。 – ovgolovin 2013-06-27 14:26:18
击4有此功能:
如果`|使用'&'时,command1的标准错误通过管道连接到command2的标准输入;它是2> & 1 |的简写。这个标准错误的隐式重定向是在命令指定的任何重定向之后执行的。
zsh也有此功能。
-
与其他/旧的贝壳,刚进入这个明确的
FirstCommand 2> & 1 |其他命令
从阅读文档,这不仅仅是标准错误*和*输出,而只是标准错误,但很高兴知道。我想,开始看bash 4的时候了。 – paxdiablo 2009-10-02 07:11:22
当前bash手册中显示“如果使用|&,命令的 标准错误,**除标准输出外,**连接到command2的标准输入”。这显然不是OP想要的。 – 2017-06-21 14:37:52
@ PeterA.Schneider:OP表示“将标准输出保留到当前位置”,这可能是不明确的。 – 2017-06-21 14:54:07
交换是伟大的,因为它解决了这个问题。以防万一你甚至不需要原始stdout,你可以这样做:
proc1 2>&1 1>/dev/null | proc2
该命令是至关重要的;你不想要:
proc1 >/dev/null 2>&1 | proc1
因为这会将所有内容重定向到/dev/null
!
还有process substitution。这使得一个过程替代了一个文件。
您可以发送stderr
到一个文件,如下所示:
process1 2> file
但是你可以为如下文件替换的过程:
process1 2> >(process2)
这里是发送stderr
到两个屏幕一个具体的例子并添加到日志文件中
sh myscript 2> >(tee -a errlog)
您可以在'rc'中做这样一个简单的重定向,这是另一个shell。例如:'proc1 | [2] proc2'。这不是很好吗? 虽然不是'bash'。 – Rolf 2018-03-01 20:41:04