在bash中同时使用stdout和stderr管道?

在bash中同时使用stdout和stderr管道?,bash,stdout,stderr,piping,Bash,Stdout,Stderr,Piping,新版本的bash似乎有&>操作符,它(如果我理解正确的话)将stdout和stderr重定向到一个文件(&>附加到该文件,正如Adrian所阐明的) 实现同样的功能,但通过管道传输到另一个命令,最简单的方法是什么 例如,在这一行中: cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError 我希望grep能够匹配stdout和stderr中的内容(实际上,将它们合并到一个流中) 注意:此问题是关于管道

新版本的bash似乎有
&>
操作符,它(如果我理解正确的话)将stdout和stderr重定向到一个文件(
&>
附加到该文件,正如Adrian所阐明的)

实现同样的功能,但通过管道传输到另一个命令,最简单的方法是什么

例如,在这一行中:

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
我希望grep能够匹配stdout和stderr中的内容(实际上,将它们合并到一个流中)

注意:此问题是关于管道而不是重定向的问题-因此它不是当前标记为重复的问题的副本。

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

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

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):

或者,使用
=bash-4

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

Bash是
2>和<1
的缩写,即
|和
,它通过管道传输stdout和stderr(请参阅):


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

感谢您对
&>
的澄清。我已经更正了我的问题。我在回答中添加了你的例子,以防根据我给出的例子不明显。作为旁注,您还可以使用特定于bash的
|&
而不是
2>&1
。关于@AdrianFrühwirth为未来读者提出的快捷方式
|&
的旁注:只有
bash
版本4+才支持此功能。如果您使用的是3或以下版本,则必须坚持使用
2>&1
。Bash重定向是无效的@AdrianFrühwirth做得很好,粘贴的链接更进一步。有时候,我希望官方的Bash文档有那么好。感谢您添加这个完整的文档。我将保持另一个答案的正确性,因为许多人仍在使用bash pre-4.0。但这是有用的。最明显的可能是,macOS上提供的Bash太旧了,无法支持它。@Flimm但zsh不是ksh使用的|&对于coproc来说,对于不必要的速记来说,这似乎是一个糟糕的选择。我不喜欢看到像下一个家伙一样有一堆DUP和重定向的行,但是有一点要说的是明确的…我很抱歉,这个评论没有添加太多内容。我只是想表达对速记的厌恶,而不是对一个实际有用的答案投下否决票,因为人们看到这一点很好。我不知道这一点,所以谢谢你提醒我。@PaulHodges我同意它不可移植-我主要喜欢在交互式Bash会话中使用它,以避免键入太多。有关stdout和stderr的正确管道方法,请参阅链接问题的第二个答案()。不需要再问了。@triplee不是完全相同的,是吗?管道与重定向到文件?@BenjaminW至少有一个答案可以解决这两种情况,尽管这不是公认的答案。这是一个相当常见的问题,因此我们可能会找到一个更好的副本,或者请版主合并这些内容,或者在最坏的情况下,为这个主题制定一个全新的规范。如果你找到一个更好的傻瓜,一定要提出。提前谢谢。@tripleee解决了,是的,但没有一个答案使用了
|&
快捷方式,我认为这是“将stdout和stderr重定向到管道”的最方便的解决方案。这不是链接问题的重复,也不清楚Marko的答案是否符合我的要求。而且,它没有提到&。投票重新开放。
cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError
cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError
cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError