【问题标题】:How to redirect stderr and stdout to different files in the same line in script?如何将stderr和stdout重定向到脚本同一行中的不同文件?
【发布时间】:2011-12-15 15:15:45
【问题描述】:

我知道这么多:

$ command 2>> error

$ command 1>> output

有什么办法可以将stderr输出到错误文件,并将stdout输出到bash的同一行中的输出文件?

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    可以重定向多个命令的输出。这适用于命令行或在 bash 脚本中最有用。 -s 将密码提示指向屏幕。

    Hereblock cmds stdout/stderr 被发送到单独的文件中,没有任何内容可以显示。

    sudo -s -u username <<'EOF' 2>err 1>out
    ls; pwd;
    EOF
    

    Hereblock cmds stdout/stderr 被发送到单个文件并显示。

    sudo -s -u username <<'EOF' 2>&1 | tee out
    ls; pwd;
    EOF
    

    Hereblock cmds stdout/stderr 被发送到单独的文件和 stdout 以显示。

    sudo -s -u username <<'EOF' 2>err | tee out
    ls; pwd;
    EOF
    

    根据您的身份 (whoami) 和用户名,可能需要也可能不需要密码。

    【讨论】:

      【解决方案2】:

      试试这个:

      your_command 2>stderr.log 1>stdout.log
      

      更多信息

      数字09 是bash 中的文件描述符0 代表标准输入,1 代表标准输出,2 代表标准错误。 39 可用于任何其他临时用途。

      任何文件描述符都可以使用&gt; 操作符重定向到一个文件或另一个文件描述符。您可以改为使用运算符 &gt;&gt; 来追加文件,而不是创建一个空文件。

      用法:

      file_descriptor > filename
      
      file_descriptor > &file_descriptor
      

      请参考Advanced Bash-Scripting Guide: Chapter 20. I/O Redirection

      【讨论】:

      • 谢谢。我搜索了一个小时
      【解决方案3】:

      或者,如果您想在一个文件中混合输出(stdout 和 stderr),您可能想要使用:

      command > merged-output.txt 2>&1
      

      【讨论】:

      • 这不是问题的答案。
      • 人们为什么要合并输出或建议合并输出?
      • @nurettin:也许你有一个脚本行,它只执行一个命令并立即将输出保存到一个日志文件中。有问题的命令有时可能会失败,因此您也希望将任何错误保存到同一个日志文件中。
      • @streamofstars 是的,当然你是对的,也许有时这就是人们想要的,我在这个问题的背景下发表评论,作为一个正在寻找答案并在 stackoverflow 上发现了很多不相关的问题的人。
      【解决方案4】:

      只需将它们添加到一行command 2&gt;&gt; error 1&gt;&gt; output

      但是,请注意&gt;&gt; 用于在文件已有数据的情况下追加。而&gt; 将覆盖文件中的所有现有数据。

      所以,如果你不想追加,command 2&gt; error 1&gt; output

      为了完成,您可以将1&gt; 写成&gt;,因为默认文件描述符是输出。所以1&gt;&gt; 是一回事。

      所以,command 2&gt; error 1&gt; output 变为 command 2&gt; error &gt; output

      【讨论】:

      • 很好的答案!我真的很喜欢你对1&gt; 可以写成&gt; 的解释
      • 这与command &amp;2&gt;err.log 有什么不同,我想我完全混淆了sintaxies。 (所有 bash pipe-isms 的适当答案的链接可能是有序的)
      • @ThorSummoner tldp.org/LDP/abs/html/io-redirection.html 是我认为您正在寻找的东西。 Fwiw,看起来 command &amp;2&gt;err.log 不太合法——该语法中的 & 符号用于文件描述符作为目标,例如 command 1&gt;&amp;2 会将 stdout 重新路由到 stderr。
      • @DreadPirateShawn,请不要将 ABS 作为参考链接——它偶尔会包含完全不准确的内容,并且经常包含不良做法示例。 wiki.bash-hackers.org/howto/redirection_tutorial 是一个更好的重定向参考源。
      • 不应该总是先重定向标准输出,然后再重定向标准错误??
      【解决方案5】:

      这样:

      $ command >>output 2>>error
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-02
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 2021-09-08
        • 1970-01-01
        相关资源
        最近更新 更多