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

2>&1

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

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

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。

其他回答

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

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

帮助你记住

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

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

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

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

dup2(1, 2);

请参见手册页。

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

command >file 2>&1

…与…不同。。。

command 2>&1 >file

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

0表示输入,1表示标准输出,2表示标准错误。

一个提示:somecmd>1.text 2>&1是正确的,而somecmd2>&1>1.text完全错误,没有效果!

这些数字表示文件描述符(fd)。

零是标准输入一个是标准输出二是标准错误

2> &1将fd 2重定向为1。

如果程序使用任何数量的文件描述符,这都适用。

如果忘记了,可以查看/usr/include/unistd.h:

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

也就是说,我已经编写了C工具,这些工具使用非标准文件描述符进行自定义日志记录,因此除非将其重定向到文件或其他文件,否则您不会看到它。

人们,永远记住paxdiablo关于重定向目标当前位置的提示。。。这很重要。

我对2>&1运算符的个人记忆是这样的:

将&视为“和”或“添加”的意思(字符是一个“与”,不是吗?)因此它变成:“将2(stderr)重定向到1(stdout)已经/当前所在的位置,并添加两个流”。

同样的助记符也适用于其他常用的重定向,1>和2:

思考含义并或添加。。。(你知道安培符号是什么意思吗?)因此它变成:“将1(stdout)重定向到2(stderr)已经/当前所在的位置,并添加两个流”。

请记住:您必须从“末尾”、从右到左(而不是从左到右)读取重定向链。