如何将错误输出重定向到 stdout 和 stderr?
How to redirect error output to both stdout and to stderr?
我正在构建一个复杂的管道,我想在程序输出中包含 stderr 以用于记录保存,但我也希望错误保留在 stderr 上,以便我可以发现问题。
我发现 this question 询问如何将 stdout+stderr 定向到一个文件并且仍然在终端上获得 stderr;它很接近,但我还不想将 stdout 重定向到一个文件:该程序的输出将被其他脚本使用,所以我希望它保留在 stdout 上(stderr 也是如此)。所以,总结一下:
- 脚本在 fd 1 中产生输出,在 fd 2 中产生错误。
- 我希望调用程序重新排列,以便输出+错误出现在 fd 1 中,错误出现在 fd 2 中。
- 此外,错误应该与输出交错(在它们自己的缓冲允许的范围内),而不是在最后保存和添加。
尽职调查说明:使用 2>&1
捕获 stderr 非常容易。通过管道 tee
保存和查看标准输出非常容易。我也知道如何将 stdout 转移到文件并通过管道引导 stderr:command 2>&1 1>fileA | tee fileB.
但是如何复制 stderr 并将 stdout 放回 fd 1?
作为同时生成 stdout 和 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。
我正在构建一个复杂的管道,我想在程序输出中包含 stderr 以用于记录保存,但我也希望错误保留在 stderr 上,以便我可以发现问题。
我发现 this question 询问如何将 stdout+stderr 定向到一个文件并且仍然在终端上获得 stderr;它很接近,但我还不想将 stdout 重定向到一个文件:该程序的输出将被其他脚本使用,所以我希望它保留在 stdout 上(stderr 也是如此)。所以,总结一下:
- 脚本在 fd 1 中产生输出,在 fd 2 中产生错误。
- 我希望调用程序重新排列,以便输出+错误出现在 fd 1 中,错误出现在 fd 2 中。
- 此外,错误应该与输出交错(在它们自己的缓冲允许的范围内),而不是在最后保存和添加。
尽职调查说明:使用 2>&1
捕获 stderr 非常容易。通过管道 tee
保存和查看标准输出非常容易。我也知道如何将 stdout 转移到文件并通过管道引导 stderr:command 2>&1 1>fileA | tee fileB.
但是如何复制 stderr 并将 stdout 放回 fd 1?
作为同时生成 stdout 和 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。