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

标签 bash io-redirection

我正在组装一个复杂的管道,我想在程序输出中包含 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?

最佳答案

作为同时生成 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。

关于bash - 如何将错误输出重定向到 stdout 和 stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29439179/

相关文章:

bash - 虽然阅读速度非常慢

bash - 为什么管道中的重定向在 Bash 和 Zsh 中表现不同?

c - 从 shell 脚本向 C 程序发送输入

bash - 如何使用 stdout 和 stderr io-redirection 从程序中获取理智的错误/警告消息输出?

bash - while 循环与拆分文件的输入并行

bash - 如何获取上周四(含)?

bash - 运行 bash,在 "bash XXX.sh"命令中包含一个变量

windows - 将命令的输出设置为变量

如果参数和重定向之间没有空格,则 Bash 不正确的行为

bash - 由引号和未引号部分组成的字符串中的通配符扩展(通配符)