要将stderr和stdout合并到stdout流中,我们将其附加到命令中:

2>&1

例如,查看编译g++main.cpp时的前几个错误:

g++ main.cpp 2>&1 | head

2>&1的详细含义是什么?


当前回答

unix命令2>&1

这用于将错误打印到终端。

当产生错误时,它们将被写入内存地址&2的“标准错误”缓冲区,以及来自该缓冲区的2个引用和流。当产生输出时,它们被写入“标准输出”缓冲区的内存地址&1,以及来自该缓冲区的1个引用和流。

所以回到指挥部。每当程序unix_commands产生错误时,它都会将其写入错误缓冲区。因此,我们创建一个指向缓冲区2的指针,并将>错误重定向到输出缓冲区&1。此时我们就完成了,因为输出缓冲区中的任何内容都由终端读取和打印。

其他回答

回答您的问题:它接受任何错误输出(通常发送到stderr)并将其写入标准输出(stdout)。

例如,当您需要为所有输出分页时,这对于“more”很有用。有些程序喜欢将使用信息打印到stderr中。

帮助你记住

1=标准输出(程序打印正常输出)2=标准错误(程序打印错误)

“2>&1”只是将发送到stderr的所有内容指向stdout。

我还建议阅读这篇关于错误重定向的文章,其中详细介绍了这个主题。

文件描述符1是标准输出(stdout)。文件描述符2是标准错误(stderr)。

首先,2>1可能是将stderr重定向到stdout的好方法。然而,它实际上会被解释为“将stderr重定向到名为1的文件”。

&指示后面和前面的是文件描述符,而不是文件名。因此,我们使用2>&1。考虑>&成为重定向合并运营商。

这就像将错误传递到stdout或终端。

也就是说,cmd不是命令:

$cmd 2>filename
cat filename

command not found

错误被发送到文件,如下所示:

2>&1

标准错误被发送到终端。

要将stdout重定向到file.txt:

echo test > file.txt

这相当于:

echo test 1> file.txt

要将stderr重定向到file.txt:

echo test 2> file.txt

所以>是将流重定向到另一个文件描述符的语法(&I):

0是标准输入1是标准输出2是标准错误

要将stdout重定向到stderr:

echo test 1>&2   # equivalently, echo test >&2

要将stderr重定向到stdout:

echo test 2>&1

因此,在2>&1中:

2> 将stderr重定向到(未指定)文件。&1将stderr重定向到stdout。

从程序员的角度来看,这意味着:

dup2(1, 2);

请参见手册页。

了解2>&1是副本也解释了为什么。。。

command >file 2>&1

…与…不同。。。

command 2>&1 >file

第一个将两个流发送到文件,而第二个将错误发送到stdout,并将普通输出发送到文件。