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

问题描述 投票:1422回答:7

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

cmd > file.txt

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

cmd >> file.txt

要将stdoutstderr都重定向到截断的文件,我知道要使用:

cmd &> file.txt

如何重定向stdoutstderr追加到文件? cmd &>> file.txt对我不起作用。

linux bash redirect stream pipe
7个回答
1860
投票
cmd >>file.txt 2>&1

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

  1. [>>file.txt:在追加模式下打开file.txt,然后在其中重定向stdout
  2. 2>&1:将stderr重定向到stdout当前所在的位置”。在这种情况下,这是在附加模式下打开的文件。换句话说,&1重用了stdout当前使用的文件描述符。

344
投票

有两种方法,具体取决于您的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


84
投票

在Bash中,您还可以明确指定重定向到其他文件:

cmd >log.out 2>log_error.out

附加为:

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

61
投票

在Bash 4中(以及ZSH 4.3.11):

cmd &>>outfile

开箱即用


47
投票

这应该可以正常工作:

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

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


23
投票

尝试一下

You_command 1>output.log  2>&1

您对&> x.file的使用在bash4中确实有效。对此表示抱歉:(

这里有一些其他提示。

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

0代表stdin,1代表stdout,2代表stderror。 3〜9可用于其他任何临时用途。

可以使用运算符>>>(附加)将任何文件描述符重定向到其他文件描述符或文件。

用法:<< [文件描述符] >> > << [文件名 | &file_descriptor] >>请参考http://www.tldp.org/LDP/abs/html/io-redirection.html

令我惊讶的是,近十年来,还没有人发布这种方法:
如果使用不支持&>>的较旧版本的bash,也可以执行以下操作:

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

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

将stderr重定向到stdout。

    通过附加到文件来重定向新的标准输出。
  1. 此外,括号消除了顺序的任何歧义,特别是如果您希望将stdout和stderr用管道传输到另一个命令。

5
投票
© www.soinside.com 2019 - 2024. All rights reserved.