【问题标题】:How to redirect error output to both stdout and to stderr?如何将错误输出重定向到标准输出和标准错误?
【发布时间】:2015-04-03 20:23:57
【问题描述】:

我正在组合一个复杂的管道,我想在程序输出中包含 stderr 以用于记录保存,但我还希望错误保留在 stderr 上,以便我发现问题。

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

  • 脚本在 fd 1 中产生输出,在 fd 2 中产生错误。
  • 我希望调用程序重新排列,以便输出+错误出现在 fd 1 中,错误出现在 fd 2 中。
  • 此外,错误应该与输出交错(在它们自己的缓冲允许的范围内),而不是保存并在最后添加。

尽职调查注意事项:使用2>&1 捕获标准错误很容易。通过tee 管道保存和查看标准输出很容易。我也知道如何将 stdout 转移到文件并通过管道引导 stderr:command 2>&1 1>fileA | tee fileB. 但是我如何复制 stderr 并将 stdout 放回 fd 1 中?

【问题讨论】:

    标签: bash io-redirection


    【解决方案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>

      这会将标准错误重定向到后面的(伪)文件。

    • >(tee /dev/stderr)

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

    【讨论】:

    • 对,进程替换!这就是如何将非标准输出引导到管道......但是>&1tee 子进程中的意义何在?看起来它只是将标准输出变成标准输出的副本。
    • 另外,将错误发送到 /dev/tty 可能会起作用,但这不是我所希望的——如果我需要将“标准错误”捕获到文件中,我将有我的满手都是剧本的胆量。
    • 看起来 2> >(tee /dev/stderr) 完全符合我的需要。谢谢!
    • @alexis 好建议!我更新了答案去/dev/stderr
    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 2012-05-26
    • 2017-05-13
    • 1970-01-01
    • 2012-08-15
    • 2022-07-23
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多