用bash管道stdout和stderr?

时间:2013-05-11 12:55:20

标签: bash stdout stderr piping

似乎较新版本的bash具有&>运算符,如果我理解正确的话,将stdout和stderr重定向到文件(&>>将附加到文件中,因为Adrian澄清了)。

实现相同目标的最简单方法是什么,而是管道到另一个命令?

例如,在这一行:

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError

我希望grep能够匹配stdout和stderr中的内容(实际上,将它们组合成一个流)。

注意:这个问题是关于管道,重定向 - 所以它不是它当前被标记为重复的问题的副本。

2 个答案:

答案 0 :(得分:135)

(请注意,&>>file 会将附加到文件,而&>会重定向,会覆盖以前存在的文件。)

要合并stdoutstderr,您可以使用2>&1将后者重定向到前者。这将stderr(文件描述符2)重定向到stdout(文件描述符1),例如:

$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$

stdout转到stdout,stderr转到stderr。 grep只看到stdout,因此stderr会打印到终端。

另一方面:

$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$

写入stdout和stderr后,2>&1将stderr重定向回stdout,grep查看stdin上的两个字符串,从而过滤掉两者。

您可以阅读有关重定向here的更多信息。

关于你的例子(POSIX):

cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError

或使用>=bash-4

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

答案 1 :(得分:80)

Bash有2>&1 |的简写,即|&,它管道stdout和stderr(参见manual):

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

这是在Bash 4.0中引入的,请参阅release notes