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

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

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

cmd > file.txt

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

cmd >> file.txt

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

cmd &> file.txt

如何重定向附加到文件的stdout和stderr? cmd &>> file.txt不适合我。

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

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

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

340
投票

有两种方法可以执行此操作,具体取决于您的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


83
投票

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

cmd >log.out 2>log_error.out

附加将是:

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

61
投票

在Bash 4(以及ZSH 4.3.11)中:

cmd &>>outfile

刚开箱即用


44
投票

这应该工作正常:

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。

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

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

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


5
投票

令我感到惊讶的是,近十年来,还没有人发布过这种方法:

如果使用旧版本的bash,其中&>>不可用,您还可以:

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

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

  1. 将stderr重定向到stdout。
  2. 通过附加到文件来重定向新标准输出。

此外,括号删除任何歧义,特别是如果您想将stdout和stderr管道传输到另一个命令。

© www.soinside.com 2019 - 2024. All rights reserved.