我正在组装一个复杂的管道,我想在程序输出中包含 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。
关于bash - 如何将错误输出重定向到 stdout 和 stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29439179/