myfreax

如何在Bash中将标准错误stderr重定向到stdout标准输出

将命令的输出重定向到文件或将其通过管道传递到另一个命令时,您可能会注意到错误消息已打印在屏幕上。在Bash和其他Linux Shell中,执行程序时,它使用三个标准I/O流。 每个流由一个数字文件描述符表示

3 min read
By myfreax
如何在Bash中将标准错误stderr重定向到stdout标准输出

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

在本教程中,我们将说明什么是标准输出stdout,标准输入stdin,标准错误stderr流。如何使用重定向操作符> ,重定向标准输出流,将标准错误重定向到标准输出,以便将程序的所有输出保存到文件中。

在Bash和其他Linux Shell中,执行程序时,它使用三个标准I/O流。 每个流由一个数字文件描述符表示:0表示stdin标准输入流。1 表示stdout标准输出流。2表示stderr标准错误流。文件描述符只是代表打开文件的数字描述符。

输入流通常通过在键盘上输入来向程序提供信息。程序的输出进入标准输出流,错误消息进入标准错误流。 默认情况下,输入流和错误流都打印在屏幕上。

重定向标准输出流

重定向是一种从程序捕获输出并将其作为输入并发送到另一个程序或文件的方法。流可以使用n>运算符重定向,其中n是文件描述符。省略n时,默认为标准输出流1。 例如,以下两个命令是相同的。 两者都会将command的标准输出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,以便将所有内容都保存在一个文件中。请使用以下命令:

command > file 2>&1

> file将command的stdout重定向到file2>&1将command的stderr重定向到stdout。我们尝试一下如何验证这一点。比如我们要验证abcdefg命令是否存在于我们系统上:

command abcdefg 

上面的命令将在终端上打印一条错误消息command not found: abcdefg 命令未找到,当你使用以下命令时,终端不会打印任何消息,你可以在file文件找到错误的消息:

command abcdefg > file 2>&1

重定向的顺序也很重要。 例如,以下示例仅将stdout重定向到file文件。 这是因为stderr重定向到stdout 。而只有stdout重定向到file,因此你还会在终端上看到打印错误消息。

command 2>&1 > file

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

command &> file

结论

在命令行上工作时,了解重定向和文件描述符的概念非常重要。要重定向stderrstdout,请使用2>&1&>构造。如果您有任何问题或反馈,请随时发表评论。

Related Articles