要将stderr和stdout合并到stdout流中,我们将其附加到命令中:
2>&1
例如,查看编译g++main.cpp时的前几个错误:
g++ main.cpp 2>&1 | head
2>&1的详细含义是什么?
要将stderr和stdout合并到stdout流中,我们将其附加到命令中:
2>&1
例如,查看编译g++main.cpp时的前几个错误:
g++ main.cpp 2>&1 | head
2>&1的详细含义是什么?
当前回答
回答您的问题:它接受任何错误输出(通常发送到stderr)并将其写入标准输出(stdout)。
例如,当您需要为所有输出分页时,这对于“more”很有用。有些程序喜欢将使用信息打印到stderr中。
帮助你记住
1=标准输出(程序打印正常输出)2=标准错误(程序打印错误)
“2>&1”只是将发送到stderr的所有内容指向stdout。
我还建议阅读这篇关于错误重定向的文章,其中详细介绍了这个主题。
其他回答
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。
我建议你试着理解这些。
我发现了这篇关于重定向的精彩文章:关于重定向
将标准输出和标准错误重定向到文件
$command&>文件
这一行程序使用&>运算符将输出流stdout和stderr从命令重定向到文件。这是Bash将两个流快速重定向到同一目的地的快捷方式。
以下是Bash重定向两个流后文件描述符表的样子:
如您所见,stdout和stderr现在都指向文件。所以任何写入stdout和stderr的内容都会写入文件。
有几种方法可以将两个流重定向到同一目标。您可以逐个重定向每个流:
$command>文件2>&1
这是将两个流重定向到文件的更常见的方法。首先将stdout重定向到文件,然后复制stderr以与stdout相同。所以两个流都指向文件。
当Bash看到几个重定向时,它会从左到右处理它们。让我们来看看这些步骤是如何实现的。在运行任何命令之前,Bash的文件描述符表如下所示:
现在Bash处理第一个重定向>文件。我们以前见过这个,它使stdout指向文件:
下一个Bash看到第二个重定向2>&1。我们以前从未见过这种重定向。这一个将文件描述符2复制为文件描述符1的副本,我们得到:
两个流都已重定向到文件。
不过,这里要小心!写
命令>文件2>&1
与书写不同:
$command 2>&1>文件
重定向的顺序在Bash中很重要!此命令仅将标准输出重定向到文件。stderr仍将打印到终端。为了理解为什么会发生这种情况,让我们再次重复这些步骤。因此,在运行该命令之前,文件描述符表如下所示:
现在Bash处理从左到右的重定向。它首先看到2>&1,因此将stderr复制到stdout。文件描述符表变为:
现在Bash看到了第二个重定向>文件,它将stdout重定向到文件:
你看到这里发生了什么吗?标准输出现在指向文件,但标准错误仍然指向终端!写入stderr的所有内容仍然会打印到屏幕上!所以在重定向的顺序上要非常非常小心!
还要注意,在Bash中
$command&>文件
与以下内容完全相同:
$命令>文件(&F)
从程序员的角度来看,这意味着:
dup2(1, 2);
请参见手册页。
了解2>&1是副本也解释了为什么。。。
command >file 2>&1
…与…不同。。。
command 2>&1 >file
第一个将两个流发送到文件,而第二个将错误发送到stdout,并将普通输出发送到文件。
人们,永远记住paxdiablo关于重定向目标当前位置的提示。。。这很重要。
我对2>&1运算符的个人记忆是这样的:
将&视为“和”或“添加”的意思(字符是一个“与”,不是吗?)因此它变成:“将2(stderr)重定向到1(stdout)已经/当前所在的位置,并添加两个流”。
同样的助记符也适用于其他常用的重定向,1>和2:
思考含义并或添加。。。(你知道安培符号是什么意思吗?)因此它变成:“将1(stdout)重定向到2(stderr)已经/当前所在的位置,并添加两个流”。
请记住:您必须从“末尾”、从右到左(而不是从左到右)读取重定向链。
2> &1是POSIX外壳构造。以下是逐个令牌的细分:
2:“标准错误”输出文件描述符。
>&:复制输出文件描述符运算符(输出重定向运算符>的变体)。给定[x]>&[y],由x表示的文件描述符被制作为输出文件描述符y的副本。
1“标准输出”输出文件描述符。
表达式2>&1将文件描述符1复制到位置2,因此在执行环境中写入2的任何输出(“标准错误”)都将转到最初由1描述的相同文件(“标准输出”)。
进一步解释:
文件描述符:“每个进程唯一的非负整数,用于标识用于文件访问的打开文件。”
标准输出/错误:请参阅shell文档的重定向部分中的以下注释:
打开的文件由以零开头的十进制数字表示。最大的可能值是定义的实现;然而,所有实现都应支持至少0到9(包括0到9)供应用程序使用。这些数字称为“文件描述符”。值0、1和2具有特殊含义和常规用途,并由某些重定向操作暗示;它们分别称为标准输入、标准输出和标准误差。程序通常从标准输入中获取输入,并将输出写入标准输出。错误消息通常写在标准错误上。重定向运算符前面可以有一个或多个数字(不允许插入字符),以指定文件描述符编号。