如何在Bash中将stderr重定向到stdout

时间:2020-03-05 15:31:38  来源:igfitidea点击:

当将命令的输出重定向到某个文件或者通过管道将其发送到另一个命令时,您可能会注意到错误消息已打印在屏幕上。

在Bash和其他Linux shell中,当一个程序被执行时,它使用三个标准的I/O流。
每个流都由一个数字文件描述符表示:

  • 0-标准输入流。

  • 1-标准输出流。

  • 2-stderr,标准错误流。

文件描述符只是一个表示打开文件的数字。

输入流通常通过在键盘上键入来向程序提供信息。

程序输出到标准输入流,错误消息转到标准错误流。
默认情况下,输入和错误流都打印在屏幕上。

重定向输出

重定向是一种从程序捕获输出并将其作为输入发送到另一个程序或者文件的方法。

可以使用n>运算符重定向流,其中n是文件描述符编号。

当省略n时,它默认为1,即标准输出流。
例如,以下两个命令是相同的;都将命令输出(stdout)重定向到文件。

command > file
command 1> file

要重定向标准错误(stderr),请使用2>运算符:

command 2> file

您可以将stderr和stdout写入两个单独的文件:

command 2> error.txt 1> output.txt

要禁止在屏幕上显示错误消息,请将stderr重定向到/dev/null:

command 2> /dev/null

将stderr重定向到stdout

当将程序的输出保存到文件中时,通常会将stderr重定向到stdout,这样就可以在一个文件中包含所有内容。

要将stderr重定向到stdout并将错误消息发送到与标准输出相同的文件,请使用以下命令:

command > file 2>&1

file将stdout重定向到file,2>&1将stderr重定向到stdout的当前位置。

重定向的顺序很重要。
例如,下面的示例只将stdout重定向到file。
这是因为stderr在stdout被重定向到file之前被重定向到stdout。

command 2>&1 > file

将stderr重定向到stdout的另一种方法是使用&>构造。
在Bash中,&>与2>&1具有相同的含义:

command &> file