似乎较新版本的 bash 具有&>运算符,该运算符(如果我理解正确的话)将 stdout 和 stderr 都重定向到文件(&>>如 Adrian 所澄清的那样,追加到文件中)。
&>
&>>
实现相同目的的最简单方法是什么,而不是管道到另一个命令?
例如,在这一行中:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
我希望 grep 匹配 stdout 和 stderr 中的内容(实际上,将它们组合成一个流)。
注意 :这个问题是询问管道, 而不是 重定向 - 所以它不是它当前标记为重复的问题的重复。
(请注意,&>>file 追加 到文件时&>会重定向并 覆盖 先前存在的文件。)
&>>file
要合并stdout,stderr您将使用2>&1. 这会将 stderr(文件描述符 2)重定向到 stdout(文件描述符 1),例如:
stdout
stderr
2>&1
$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std stderr $
stdout进入标准输出,stderr进入标准错误。grep只看到stdout,因此stderr打印到终端。
grep
另一方面:
$ { 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:
>=bash-4
cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError