如何将标准输出和标准错误输出同时重定向到一个文件中

362

我正在运行一个Bash脚本来为命令的执行创建一个日志文件。

我使用以下命令:

Command1 >> log_file
Command2 >> log_file

该命令仅发送标准输出,而不是出现在终端上的标准错误信息。

5个回答

574

如果您想将日志记录到同一个文件:

command1 >> log_file 2>&1

如果您想要不同的文件:

command1 >> log_file 2>> err_file

179
为了避免其他人的挫败感,注意顺序很重要:2>&1 需要在 >> log_file 之后出现。 - Rufflewind
8
为什么要用 >> 而不是 > - user3527975
19
">>" 会将内容追加到文件末尾,">" 则会覆盖原有内容。要了解更多详情,请搜索 "shell 重定向"。 - Mat
5
一种不保存日志文件而是直接查看的变体,例如当“make”命令输出了成千上万行错误信息超出了屏幕滚动区域时,可以使用以下命令:vi <(make 2>&1) - Camille Goudeseune
17
可以通过以下命令同时将输出显示在屏幕上并保存到文件中:command 2>&1 | tee log_file。请注意,翻译尽可能保持了原意并使其更加易于理解,但未添加解释或额外内容。 - Jonathan Hartley
显示剩余7条评论

272

最简单的重定向两者的语法是:

command &> logfile
如果你想追加文件而不是覆盖它:
command &>> logfile

7
我不确定这个操作符是什么时候添加的,但它可能在旧版本的 Bash 中无法使用。 在我的机器上运行的是 Gnu bash v3.2.48,看起来它可以正常工作。 - James Wald
12
@CostiCiudatu在Mac OS X中似乎无法使用&>>运算符,我认为更安全的做法是使用Mat的解决方案。 - James Fennell
4
@JamesFennell 你说得对,我之前不知道这件事。我点赞了被采纳的答案 :) - Costi Ciudatu
12
记录一下,&> 在 OS X 10.11.1 上(似乎是 bash 3.2)已经正常工作了。 - LiberalArtist
4
http://www.tldp.org/LDP/abs/html/io-redirection.html提到这种语法在“Bash 4,最终版本”中已经可以使用。 - Dagrada
显示剩余4条评论

50

你可以这样做来将2和1合并:

 command > file 2>&1

20
+1,2>&1将文件描述符2(stderr)重定向到文件描述符1(stdout)。 - Sjoerd
1
为什么这里需要一个“&”符号?即为什么是2>&1而不是2>1? - btomtom5
3
@btomtom5说的&代表文件描述符。否则,你要如何向名为1的文件写入内容? - vstepaniuk
1
@vstepaniuk 我猜这取决于上下文?在 ">" 之前,我们不需要使用 & 来表示文件描述符,因为在这种情况下只有文件描述符是可能的,所以 & 是隐含的。在 ">" 之后,目标可以是任何东西,因此我们必须使用显式的 & 来指定我们正在引用文件描述符而不是名为 "1" 的文件。 - torez233
1
@vstepaniuk 我猜这取决于上下文。在 ">" 之前,我们不需要使用 & 来表示文件描述符,因为在这个上下文中只有文件描述符是可能的,所以 & 是隐含的。在 ">" 之后,目标可以是任何东西,所以我们必须使用显式的 & 来指定我们正在引用一个文件描述符,而不是一个名为 "1" 的文件。 - torez233

10

用途:

command >>log_file 2>>log_file

0

请使用command 2>file

这里的2代表标准错误输出的文件描述符stderr。您也可以使用1代替2,以便将标准输出stdout重定向到“文件”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接