将命令的输出重定向到文件或将其通过管道传递到另一个命令时,您可能会注意到错误消息已打印在屏幕上。
在本教程中,我们将说明什么是标准输出stdout
,标准输入stdin
,标准错误stderr
。
如何使用重定向操作符>
,重定向标准输出,将标准错误重定向到标准输出,以使将程序的所有输出保存到文件中。
在Bash和其他Linux Shell中,执行程序时,它使用三个标准I/O流。每个I/O流由一个数字文件描述符表示。
0
表示stdin
标准输入流。1
表示stdout
标准输出流。2
表示stderr
标准错误流。文件描述符只是代表打开文件的数字描述符。
标准输入通常是键盘上输入。程序的输出进入标准输出流,错误消息进入标准错误流。 默认情况下,输入流和错误流都打印在屏幕上。
重定向标准输出
重定向是一种从程序捕获输出并将其作为另一个程序或文件输入的方法。
重定向可以使用n>
运算符进行重定向,其中n
是文件描述符。省略n
时,默认为标准输出流1
。
例如,以下两个命令是相同的。两者都会将command的标准输出重定向到文件。要重定向标准错误流stderr
,请使用2>
运算符。
command > file
command 1> file
command 2> file #重定向标准错误到文件
您可以将标准错误和标准输出都写到两个单独的文件中,运行命令command 2> error.txt 1> output.txt
。
要禁止在屏幕上显示错误消息,请将标准错误流stderr
重定向到/dev/null
空设备。
command 2> error.txt 1> output.txt
command 2> /dev/null
将标准错误重定向到标准输出
将程序的输出保存到文件中时,通常会将标准错误重定向到标准输出,以使所有内容都保存在一个文件中。
command > file 2>&1
> file
将command的标准输出重定向到file
,2>&1
将command的标准错误重定向到标准输出
。
我们尝试一下如何验证这一点。比如我们要验证abcdefg
命令是否存在于我们系统上。运行命令command abcdefg
。
命令command abcdefg
将在终端上打印一条错误消息command not found: abcdefg
命令未找到。
当你运行command abcdefg > file 2>&1
命令时,终端不会打印任何消息,你可以在file文件找到错误的消息。
command abcdefg
command abcdefg > file
command abcdefg > file 2>&1
重定向的顺序也很重要。例如,以下示例仅将标准输出重定向到文件。这是因为标准错误重定向到标准输出。
而只有标准输出重定向到文件,因此你还会在终端上看到打印的错误消息。
将标准错误重定向到标准输出的另一种方法是使用&>
构造。在Bash中,&>
与2>&1
的含义相同。
command 2>&1 > file
command &> file
结论
在命令行上工作时,了解重定向和文件描述符的概念非常重要。要重定向stderr
和stdout
,请使用2>&1
或&>
构造。如果您有任何问题或反馈,请随时发表评论。