【问题标题】:Redirecting stdout and stderr while duplicating stderr to another file in bash在将stderr复制到bash中的另一个文件时重定向stdout和stderr
【发布时间】:2017-07-21 17:52:30
【问题描述】:

我正在尝试重定向一些 bash 脚本输出。 我想做的是:

./some_script.sh 2> error.log >> all_output.log 2>&1

我想把stderr放在一个文件里,把stderr和stdout放在另一个文件里。

此外,我想在 all_output.log 的末尾追加(对于无关紧要的 error.log)。

但是我没有得到正确的语法,我尝试了很多东西,但我无法找到正确的方法。

感谢您的帮助! :)

【问题讨论】:

    标签: bash io


    【解决方案1】:

    重定向语句(如> foo2> bar1>&2)最好像分配文件描述符一样读取,从左到右执行。您的代码执行此操作:

    2> error.log
    

    表示:fd2 = open_for_writing('error.log')

    >> all_output.log
    

    表示:fd1 = open_for_appending('all_output.log')

    2>&1
    

    表示:fd2 = fd1

    由此你可以理解第一条语句(2> error.log)除了可能创建(空的)error.log之外没有任何作用。

    您想要实现的是复制一个流到两个不同的目标。这不是通过仅仅重定向任何东西来完成的。为此,您需要一个进程来读取一件事并将其写入两个不同的流中。最好使用tee(1)

    不幸的是,将流传递给其他进程是通过管道完成的,它们只传递标准输出,而不传递标准错误。要实现您的目标,您必须先交换 stderr 和 stdout。

    完整的调用结果如下所示:

    (./some_script.sh 3>&2 2>&1 1>&3 | tee error.log) >> all_outputlog 2>&1
    

    【讨论】:

    • 非常感谢,你让我开心!我想这对我来说有点太棘手了
    • @Xerock 你毁了我 22222 的好名声(现在是 22237)。不过,我对此并不不满;-)
    • 真棒答案@Alfe完美解释
    • @Alfe 对不起^^ 越高越好!
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2013-02-15
    • 2022-01-18
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多