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

ale*_*xis 5 bash io-redirection

我正在组建一个复杂的管道,我想在程序输出中包含stderr以便记录,但我也希望错误保留在stderr上,这样我就能发现问题.

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

  • 脚本生成fd 1中的输出,fd 2中的错误.
  • 我希望调用程序重新排列事物,以便输出+错误出现在fd 1中,错误出现在fd 2中.
  • 此外,错误应与输出交错(尽可能与自己的缓冲允许),而不是保存并在最后添加.

尽职调查:捕捉stderr很容易2>&1.通过管道输出可以轻松保存和查看标准输出tee.我也知道如何将stdout转移到文件并通过管道直接stderr:command 2>&1 1>fileA | tee fileB.但是如何复制stderr并将stdout放回fd 1?

Joh*_*024 5

作为生成 std​​out 和 stderr 的测试,让我们使用以下命令:

{ echo out; echo err >&2; }
Run Code Online (Sandbox Code Playgroud)

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

$ { echo out; echo err >&2; } 2> >(tee /dev/stderr) | cat >f
err
$ cat f
out
err
Run Code Online (Sandbox Code Playgroud)

怎么运行的

  • 2>

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

  • >(tee /dev/stderr)

    这是进程替换,它充当从 stderr 接收输入的伪文件。它接收到的任何输入都会发送到tee命令,该命令将其发送到 stderr 和 stdout。