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

2>&1

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

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

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


当前回答

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

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

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

其他回答

如果系统上不存在/foo,而/tmp确实存在…

$ ls -l /tmp /foo

将打印/tmp的内容并为/foo打印错误消息

$ ls -l /tmp /foo > /dev/null

将/tmp的内容发送到/dev/null并为/foo打印错误消息

$ ls -l /tmp /foo 1> /dev/null

将完全相同(注意1)

$ ls -l /tmp /foo 2> /dev/null

将打印/tmp的内容并将错误消息发送到/dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

将向/dev/null发送列表和错误消息

$ ls -l /tmp /foo > /dev/null 2> &1

是速记

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

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

帮助你记住

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

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

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

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

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

重定向输入输入重定向导致文件名为将要打开以读取文件的单词展开的结果描述符n或标准输入(文件描述符0),如果n是未指定。重定向输入的一般格式为:[n] <单词重定向输出输出重定向导致文件name是将要打开以供书写的单词展开后的结果文件描述符n或标准输出(文件描述符1),如果n未指定。如果文件不存在,则创建该文件;如果它它被截断为零大小。重定向输出的一般格式为:[n] >单词移动文件描述符重定向运算符,[n] <数字(&D)-将文件描述符数字移动到文件描述符n,或如果未指定n,则为标准输入(文件描述符0)。数字在复制到n之后是闭合的。类似地,重定向运算符[n] >数字(&D)-将文件描述符数字移动到文件描述符n,或如果未指定n,则为标准输出(文件描述符1)。

Ref:

man bash

键入/^REDIRECT以定位到重定向部分,并了解更多信息。。。

这里有一个在线版本:3.6重定向

PS:

很多时候,人类是学习Linux的强大工具。

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

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

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

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

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

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