在bash中同时输出stdout和stderr?


156

似乎较新版本的bash具有&>运算符,(如果我理解正确的话)该运算符会将stdout和stderr都重定向到文件(&>>如Adrian所阐明的那样,追加到文件中)。

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

例如,在这一行:

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

我希望grep可以匹配stdout和stderr中的内容(有效地,将它们组合成一个流)。

注意:这个问题是在询问管道,而不是重定向-因此,它不是当前标记为重复的问题的重复。


请参阅链接的问题的第二个答案(stackoverflow.com/a/637834/1129642),以获取同时传输stdout和stderr的正确方法。无需其他问题。
Marki555 '16

4
@triplee不是完全重复吗?管道与重定向到文件?
本杰明·W.

@BenjaminW那里至少有一个答案可以解决这两种情况,尽管这不是公认的答案。这是一个相当普遍的问题,因此我们可能会找到更好的副本,或者要求主持人将其合并-甚至在最坏的情况下,也可以针对该主题制定全新的规范。如果您找到更好的骗子,请务必提出建议。提前致谢。
三胞胎

12
@tripleee解决,是的,但是没有答案使用|&快捷方式,我认为这是“将stdout和stderr都重定向到管道”的最方便的解决方案。
本杰明·W.

3
这不是链接问题的重复,而且不清楚Marko的回答是否符合我的要求。另外,它没有提及|&。投票重新开放。
Martin Bonner

Answers:


163

(请注意,&>>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上看到两个字符串,从而过滤掉两个字符串。

您可以在此处阅读有关重定向的更多信息

关于您的示例(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

感谢您对的澄清&>>。我已经纠正了我的问题。
安德鲁·费里尔

18
我将您的示例添加到我的答案中,以防万一根据我给出的示例它并不明显。另外,您也可以使用特定于bash的|&来代替2>&1 |
AdrianFrühwirth,2013年

13
|&@AdrianFrühwirth为将来的读者建议的快捷方式的旁注:此功能仅在bash4+版本中受支持。如果您使用的是3或以下,则必须坚持使用2>&1 |
tomocafe 2014年

3
Bash重定向在这里得到很好的解释。@AdrianFrühwirth做得很好,粘贴的链接更进一步。有时候,我希望Bash的官方文档这么好。
David Andreoletti 2015年

112

Bash有一个简称2>&1 |,即|&,它同时传递stdout和stderr(请参见手册):

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

这是Bash 4.0中引入的,请参见发行说明


感谢您添加此内容以确保完整性。我将保持其他答案的正确性,因为许多人仍在使用bash 4.0之前的版本。但这很有用。
安德鲁·费里尔

9
最值得注意的也许是,macOS上附带的Bash太旧了,无法支持此功能。
Flimm

@Flimm但zsh不是
Trenton

1
由于ksh对coproc使用|&,因此对于不必要的简写来说,这似乎是一个错误的选择。我讨厌看到与下一个家伙一样多的重复和重定向的行,但是要说清楚是要说的....我很抱歉,此注释没有太多添加。我只是想表达对速记的厌恶,而不会否决一个实际有用的答案,因为人们可以很好地看到这一点。我不知道,所以感谢您让我知道。
Paul Hodges

@PaulHodges我同意它不是可移植的-我主要喜欢在交互式Bash会话中使用它,以避免输入过多。
本杰明·W.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.