我怎样才能redirect和附加stdout和stderr到Bash文件?

要将stdoutredirect到Bash中的截断文件,我知道使用:

cmd > file.txt 

要在Bash中redirectstdout ,附加到一个文件,我知道使用:

 cmd >> file.txt 

为了将stdoutstderrredirect到截断的文件,我知道使用:

 cmd &> file.txt 

如何redirectstdoutstderr追加到文件? cmd &>> file.txt没有为我工作。

 cmd >>file.txt 2>&1 

Bash执行从左到右的redirect,如下所示:

  1. >>file.txt :以追加模式打开file.txt ,并在那里redirectstdout
  2. 2>&1 :将stderrredirect到“当前正在执行的stdout 。 在这种情况下,这是一个以追加模式打开的文件。 换句话说, &1重用了stdout当前使用的文件描述符。

有两种方法可以做到这一点,这取决于你的Bash版本。

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

 cmd >> outfile 2>&1 

Bash 4开始的一个不便携的方法是

 cmd &>> outfile 

(类似于&> outfile

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

  • 决定可移植性是一个问题(然后使用经典的方式)
  • 即使对Bash pre-4来说,可移植性也是一个问题(然后用经典的方式)
  • 无论使用哪种语法,都不要在同一个脚本中改变它(混淆!)

如果您的脚本已经以#!/bin/sh开头(无论是否有意),那么Bash 4解决scheme,以及任何Bash特定的代码,是不是要走的路。

还要记住,Bash 4 &>>只是更短的语法 – 它不会引入任何新的function或类似的东西。

语法是(旁边其他redirect语法)在这里描述: http : //bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output

在Bash中,你也可以明确地指定你的redirect到不同的文件:

 cmd >log.out 2>log_error.out 

追加将是:

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

在Bash 4(以及ZSH 4.3.11)中:

 cmd &>>outfile 

只是在框外

这应该工作得很好:

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

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

尝试这个

 You_command 1>output.log 2>&1 

您使用&> x.file在bash4中工作。 对不起:(

这里有一些额外的提示。

0,1,2 … 9是bash中的文件描述符。 0代表stdin,1代表标准输出,2代表stderror。 3〜9用于其他临时使用。

任何文件描述符可以通过运算符>或>>(附加)redirect到其他文件描述符或文件。

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

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