如何将错误输出重定向到 stdout 和 stderr?

How to redirect error output to both stdout and to stderr?

我正在构建一个复杂的管道,我想在程序输出中包含 stderr 以用于记录保存,但我也希望错误保留在 stderr 上,以便我可以发现问题。

我发现 this question 询问如何将 stdout+stderr 定向到一个文件并且仍然在终端上获得 stderr;它很接近,但我还不想将 stdout 重定向到一个文件:该程序的输出将被其他脚本使用,所以我希望它保留在 stdout 上(stderr 也是如此)。所以,总结一下:

尽职调查说明:使用 2>&1 捕获 stderr 非常容易。通过管道 tee 保存和查看标准输出非常容易。我也知道如何将 stdout 转移到文件并通过管道引导 stderr:command 2>&1 1>fileA | tee fileB. 但是如何复制 stderr 并将 stdout 放回 fd 1?

作为同时生成 std​​out 和 stderr 的测试,让我们使用以下内容:

{ echo out; echo err >&2; }

以下代码演示了如何将 stdout 和 stderr 发送到管道中的下一步,同时还将 stderr 发送到终端:

$ { echo out; echo err >&2; } 2> >(tee /dev/stderr) | cat >f
err
$ cat f
out
err

工作原理

  • 2>

    这会将 stderr 重定向到后面的(伪)文件。

  • >(tee /dev/stderr)

    这是进程替换,它作为一个伪文件从 stderr 接收输入。它收到的任何输入都被发送到 tee 命令,该命令将它发送到 stderr 和 stdout。