Piping both stdout and stderr in bash?
新版本的bash似乎有&>操作符,它(如果我理解正确的话)将stdout和stderr都重定向到一个文件(&>>将附加到文件中,正如adrian所阐明的那样)。
要实现相同的目标,最简单的方法是什么,而不是通过管道发送到另一个命令?
例如,在此行中:
1
| cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError |
我希望grep能够匹配stdout和stderr中的内容(实际上,将它们组合成一个流)。
注意:此问题询问的是管道,而不是重定向-因此它不是当前标记为的问题的副本。
- 请参阅有关链接问题的第二个答案(stackoverflow.com/a/637834/1129642),以了解正确的方式连接stdout和stderr。不用再问了。
- @三倍的不是一个精确的复制品,是吗?管道与重定向到文件?
- @Benjaminw至少有一个答案可以解决这两种情况,尽管这不是公认的答案。这是一个相当常见的问题,因此我们可能会找到更好的副本,或者要求版主合并这些副本,甚至在最坏的情况下,为这个主题创建一个全新的规范。如果你找到一个更好的替身,一定要求婚。事先谢谢。
- @Triplee解决了这个问题,是的,但是没有一个答案使用|&的快捷方式,我认为这是迄今为止"将stdout和stderr都重定向到管道"最方便的解决方案。
- 这不是一个相关问题的副本,也不清楚马尔克的回答是否符合我的要求。而且,它没有提到&;。投票重新开始。
(请注意,&>>file附加到文件,而&>将重定向并覆盖以前存在的文件。)
要将stdout和stderr结合起来,您可以使用2>&1将后者重定向到前者。这会将stderr(文件描述符2)重定向到stdout(文件描述符1),例如:
1 2 3
| $ { echo"stdout"; echo"stderr" 1>&2; } | grep -v std
stderr
$ |
stdout转到stdout,stderr转到stderr。grep只看到stdout,因此stderr打印到终端。
另一方面:
1 2
| $ { echo"stdout"; echo"stderr" 1>&2; } 2>&1 | grep -v std
$ |
在写入stdout和stderr之后,2>&1将stderr重定向回stdout,grep在stdin上看到这两个字符串,从而将两者都过滤掉。
您可以在这里阅读更多关于重定向的内容。
关于您的示例(posix):
1
| cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError |
或者,使用>=bash-4:
1
| cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError |
- 感谢您对&>>的澄清。我纠正了我的问题。
- 我在我的答案中添加了您的示例,以防根据我给出的示例不明显。作为补充说明,您还可以使用bash特定的|&,而不是2>&1 |。
- 谢谢你的澄清。有帮助的回答,谢谢。
- 有关@adrianfr&252;hwirth为未来读者建议的快捷方式|&的旁注:此功能仅在bash版本4+支持。如果你使用的是3或以下,你必须坚持使用2>&1 |。
- 这里很好地解释了bash重定向。@Adrianfr&252;Hwirth做得很好,粘贴的链接更进一步。有时候,我希望官方的bash文档是那么好。
bash有一个2>&1 |的缩写,即|&,它将stdout和stderr连接起来(参见手册):
1
| cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError |
这是在bash 4.0中引入的,请参见发行说明。
- 感谢您为完整性添加此项。我将保持另一个正确答案,因为许多人仍在使用bash pre-4.0。但这是有用的。
- 最值得注意的是,在MacOS上发布的bash太老了,无法支持这一点。
- @但是zsh不是
- 由于ksh使用&;表示coproc,对于不必要的速记来说,这似乎是一个糟糕的选择。我不喜欢看到有一堆重复和重定向的行像下一个家伙一样多,但有一些话要说清楚……我很抱歉,这个评论没有增加太多。我只是想表达对速记的厌恶,而不是对一个真正有用的答案投反对票,因为人们看到这个很好。我不知道,所以谢谢你让我知道。
- @保罗霍奇斯,我同意这是不可移植的-我主要喜欢将它用于交互式的bash会话,以避免输入太多。