关于Linux:如何将stdout和stderr重定向并附加到带有bash的文件中?

How can I redirect and append both stdout and stderr to a file with Bash?

要将stdout重定向到bash中的截断文件,我知道要使用:

1
cmd > file.txt

要重定向bash中的stdout,附加到一个文件,我知道要使用:

1
cmd >> file.txt

要将stdout和stderr重定向到截断的文件,我知道要使用:

1
cmd &> file.txt

如何重定向附加到文件的stdout和stderr?埃多克斯一〔0〕没有为我工作。


1
cmd >>file.txt 2>&1

bash执行从左到右的重定向,如下所示:

  • >>file.txt:在追加模式下打开file.txt,重定向stdout
  • 2>&1:将stderr改为"stdout目前的发展方向"。在本例中,这是以追加模式打开的文件。换句话说,&1重用了stdout当前使用的文件描述符。

  • 根据您的bash版本,有两种方法可以做到这一点。

    经典的便携式(bash pre-4)方法是:

    1
    cmd >> outfile 2>&1

    一个不可移植的方法,从bash 4开始是

    1
    cmd &>> outfile

    (模拟&> outfile)

    为了获得良好的编码风格,您应该

    • 决定是否需要考虑可移植性(然后使用经典方法)
    • 决定是否需要考虑可移植性,即使是bash pre-4(然后使用经典方法)
    • 无论使用哪种语法,都不要在同一个脚本中更改它(混淆!)

    如果您的脚本已经以#!/bin/sh开头(无论是否有意),那么bash 4解决方案,以及通常任何bash特定的代码,都不是解决方案。

    还要记住,bash 4 &>>只是较短的语法——它不引入任何新功能或类似的功能。

    这里描述的语法(除了其他重定向语法之外):http://bash hacker.org/wiki/doku.php/syntax/redientation appending_rediented_output_and_error_output


    在bash中,您还可以显式地指定重定向到不同的文件:

    1
    cmd >log.out 2>log_error.out

    附录将是:

    1
    cmd >>log.out 2>>log_error.out


    在bash 4(以及zsh 4.3.11)中:

    1
    cmd &>>outfile

    刚出盒


    这应该很有效:

    1
    your_command 2>&1 | tee -a file.txt

    它将所有日志存储在file.txt中,并将其转储到终端上。


    试试这个

    1
    You_command 1>output.log  2>&1

    您对&;>x.file的使用确实适用于bash4。对不起:(

    这里有一些额外的提示。

    0、1、2…9是bash中的文件描述符。

    0代表stdin,1代表stdout,2代表stderror。3~9备用,用于其他临时用途。

    任何文件描述符都可以使用操作符>>>重定向到其他文件描述符或文件。

    用途:>

    请参考http://www.tldp.org/ldp/abs/html/io-redirection.html


    我很惊讶,近十年来,还没有人发布这种方法:

    如果在没有&>>的情况下使用较旧版本的bash,您还可以执行以下操作:

    1
    (cmd 2>&1) >> file.txt

    这产生了一个子外壳,因此它的效率比传统的cmd >> file.txt 2>&1方法低,但我觉得这种方法更自然,更容易理解:

  • 将stderr重定向到stdout。
  • 通过附加到文件来重定向新的stdout。
  • 此外,圆括号还消除了顺序的任何模糊性,特别是如果您希望将stdout和stderr管道传输到另一个命令。