在bash中同时使用stdout和stderr管道?
新版本的bash似乎有在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中的内容(实际上,将它们合并到一个流中) 注意:此问题是关于管道
&>
操作符,它(如果我理解正确的话)将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
转到stderrgrep
只看到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