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

时间:2015-04-03 20:23:58

标签: 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中?

1 个答案:

答案 0 :(得分:4)

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