202

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

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

例如,在这一行中:

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

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

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

4

2 回答 2

201

(请注意,&>>file 追加到文件时&>会重定向并覆盖先前存在的文件。)

要合并stdoutstderr您将使用2>&1. 这会将 stderr(文件描述符 2)重定向到 stdout(文件描述符 1),例如:

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

stdout进入标准输出,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
于 2013-05-11T13:11:03.897 回答
144

Bash 有一个简写形式2>&1 |,即|&,它同时通过管道传输 stdout 和 stderr(参见手册):

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

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

于 2016-05-07T06:17:42.093 回答