协慌网

登录 贡献 社区

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

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

cmd > file.txt

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

cmd >> file.txt

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

cmd &> file.txt

如何重定向附加到文件的stdoutstderrcmd &>> file.txt对我不起作用。

答案

cmd >>file.txt 2>&1

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

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

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

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

cmd >log.out 2>log_error.out

附加将是:

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