我怎样才能redirect和附加stdout和stderr到Bash文件?
要将stdoutredirect到Bash中的截断文件,我知道使用:
cmd > file.txt
要在Bash中redirectstdout ,附加到一个文件,我知道使用:
cmd >> file.txt
为了将stdout和stderrredirect到截断的文件,我知道使用:
cmd &> file.txt
如何redirectstdout和stderr追加到文件? cmd &>> file.txt
没有为我工作。
cmd >>file.txt 2>&1
Bash执行从左到右的redirect,如下所示:
-
>>file.txt
:以追加模式打开file.txt
,并在那里redirectstdout
。 -
2>&1
:将stderr
redirect到“当前正在执行的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 >