首页 文章

如何使用Bash将stdout和stderr重定向并附加到文件中?

提问于
浏览
1264

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

cmd > file.txt

要在Bash中重定向stdout,追加到文件,我知道要使用:

cmd >> file.txt

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

cmd &> file.txt

如何重定向附加到文件的stdout和stderr? cmd &>> file.txt 对我不起作用 .

6 回答

  • 1654
    cmd >>file.txt 2>&1
    

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

    • >>file.txt :在附加模式下打开 file.txt 并在那里重定向 stdout .

    • 2>&1 :将 stderr 重定向到“ stdout 当前正在进行中” . 在这种情况下,这是一个以追加模式打开的文件 . 换句话说, &1 重用 stdout 当前使用的文件描述符 .

  • 59

    有两种方法可以执行此操作,具体取决于您的Bash版本 .

    经典便携( Bash pre-4 )方式是:

    cmd >> outfile 2>&1
    

    一种不可移植的方式,从 Bash 4 开始

    cmd &>> outfile
    

    (类似于 &> outfile

    对于良好的编码风格,你应该

    • 决定是否关注可移植性(然后使用经典方式)

    • 决定是否可以将Bash pre-4的可移植性作为一个问题(然后使用经典方式)

    • 无论你使用哪种语法,都不要在同一个脚本中更改它(混乱!)

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

    还记得Bash 4 &>> 只是更短的语法 - 它没有引入任何新功能或类似的东西 .

    这里描述的语法是(除了其他重定向语法之外):http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output

  • 79

    这应该工作正常:

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

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

  • 22

    试试这个

    You_command 1>output.log  2>&1
    

    您对&> x.file的使用在bash4中有效 . 对不起:(

    这里有一些额外的提示 .

    0,1,2 ... 9是bash中的文件描述符 .

    0代表 stdin ,1代表 stdout ,2代表 stderror . 任何其他临时使用都可以使用3~9 .

    可以使用operator >>> (append)将任何文件描述符重定向到其他文件描述符或文件 .

    用法:< file_descriptor > > < filename | &file_descriptor >

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

  • 41

    在Bash 4(以及ZSH 4.3.11)中:

    cmd &>>outfile
    

    刚开箱即用

  • 311

    在Bash中,您还可以明确指定重定向到不同的文件:

    cmd >log.out 2>log_error.out
    

    附加将是:

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

相关问题