首页 文章

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

提问于
浏览
5

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

我找到了this question,它询问如何将stdout stderr指向一个文件并仍然在终端上获得stderr;它's close, but I don' t想要将stdout重定向到一个文件:程序's output will be consumed by other scripts, so I' d喜欢它保留在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 回答

  • 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 .

相关问题