要将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的详细含义是什么?
当前回答
2> &1是POSIX外壳构造。以下是逐个令牌的细分:
2:“标准错误”输出文件描述符。
>&:复制输出文件描述符运算符(输出重定向运算符>的变体)。给定[x]>&[y],由x表示的文件描述符被制作为输出文件描述符y的副本。
1“标准输出”输出文件描述符。
表达式2>&1将文件描述符1复制到位置2,因此在执行环境中写入2的任何输出(“标准错误”)都将转到最初由1描述的相同文件(“标准输出”)。
进一步解释:
文件描述符:“每个进程唯一的非负整数,用于标识用于文件访问的打开文件。”
标准输出/错误:请参阅shell文档的重定向部分中的以下注释:
打开的文件由以零开头的十进制数字表示。最大的可能值是定义的实现;然而,所有实现都应支持至少0到9(包括0到9)供应用程序使用。这些数字称为“文件描述符”。值0、1和2具有特殊含义和常规用途,并由某些重定向操作暗示;它们分别称为标准输入、标准输出和标准误差。程序通常从标准输入中获取输入,并将输出写入标准输出。错误消息通常写在标准错误上。重定向运算符前面可以有一个或多个数字(不允许插入字符),以指定文件描述符编号。
其他回答
回答您的问题:它接受任何错误输出(通常发送到stderr)并将其写入标准输出(stdout)。
例如,当您需要为所有输出分页时,这对于“more”很有用。有些程序喜欢将使用信息打印到stderr中。
帮助你记住
1=标准输出(程序打印正常输出)2=标准错误(程序打印错误)
“2>&1”只是将发送到stderr的所有内容指向stdout。
我还建议阅读这篇关于错误重定向的文章,其中详细介绍了这个主题。
这些数字表示文件描述符(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工具,这些工具使用非标准文件描述符进行自定义日志记录,因此除非将其重定向到文件或其他文件,否则您不会看到它。
重定向输入输入重定向导致文件名为将要打开以读取文件的单词展开的结果描述符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)已经/当前所在的位置,并添加两个流”。
请记住:您必须从“末尾”、从右到左(而不是从左到右)读取重定向链。
0表示输入,1表示标准输出,2表示标准错误。
一个提示:somecmd>1.text 2>&1是正确的,而somecmd2>&1>1.text完全错误,没有效果!