要将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。此时我们就完成了,因为输出缓冲区中的任何内容都由终端读取和打印。

其他回答

2是控制台标准错误。

1是控制台标准输出。

这是标准的Unix,Windows也遵循POSIX。

例如,当您跑步时

perl test.pl 2>&1

标准错误被重定向到标准输出,因此您可以同时看到两个输出:

perl test.pl > debug.log 2>&1

执行后,您可以在debug.log中看到所有输出,包括错误。

perl test.pl 1>out.log 2>err.log

然后标准输出转到out.log,标准错误转到err.log。

我建议你试着理解这些。

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

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

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

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

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

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

要将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。

unix命令2>&1

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

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

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

如果你是初学者,我觉得这很有帮助

更新:在Linux或Unix系统中,程序将输出发送到两个位置:标准输出(stdout)和标准错误(stderr)。您可以将这些输出重定向到任何文件。就像你这样做ls-a>output.txt控制台中不会打印任何内容,所有输出(stdout)都重定向到输出文件。

如果您尝试打印任何不存在的文件的内容,则意味着输出将是一个错误,如您打印当前目录中不存在的test.txtcat test.txt>error.txt输出将为

cat: test.txt :No such file or directory

但error.txt文件将为空,因为我们将stdout重定向到一个文件而不是stderr。所以我们需要文件描述符(文件描述符只不过是一个表示打开文件的正整数。您可以说描述符是文件的唯一id)来告诉shell我们要发送到文件的输出类型。在Unix/Linux系统中,1用于stdout,2用于stderr。所以现在,如果您这样做,ls-a 1>output.txt表示您正在将标准输出(stdout)发送到output.txt。如果您执行此cat test.txt 2>error.txt,则表示您正在将标准错误(stderr)发送到error.txt。&1用于引用文件描述符1(stdout)的值。现在,点2>&1表示“将stderr重定向到我们重定向stdout的相同位置”现在你可以这样做了<br

cat mayfitle.txt>output.txt 2>&1标准输出(stdout)和标准错误(stderr)都将重定向到output.txt。

感谢Ondrej K.指出