小编典典

在 bash 中同时连接标准输出和标准错误?

all

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

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

例如,在这一行中:

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

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

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


阅读 45

收藏
2022-06-25

共1个答案

小编典典

(请注意,&>>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
2022-06-25