要将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的详细含义是什么?
当前回答
要将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)的当前位置——其他答案似乎忽略了这个货币问题。
您可以使用此方法将任何输出句柄重定向到另一个,但它最常用于将stdout和stderr流引导到单个流中进行处理。
例如:
# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR
# Run the less pager without stderr screwing up the output.
foo 2>&1 | less
# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile
# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2
请注意,最后一个命令不会将stderr重定向到outfile2,而是将其重定向到遇到参数时的stdout(outfile1),然后将stdout重定向到outile2。
这允许一些相当复杂的诡计。
2> &1是POSIX外壳构造。以下是逐个令牌的细分:
2:“标准错误”输出文件描述符。
>&:复制输出文件描述符运算符(输出重定向运算符>的变体)。给定[x]>&[y],由x表示的文件描述符被制作为输出文件描述符y的副本。
1“标准输出”输出文件描述符。
表达式2>&1将文件描述符1复制到位置2,因此在执行环境中写入2的任何输出(“标准错误”)都将转到最初由1描述的相同文件(“标准输出”)。
进一步解释:
文件描述符:“每个进程唯一的非负整数,用于标识用于文件访问的打开文件。”
标准输出/错误:请参阅shell文档的重定向部分中的以下注释:
打开的文件由以零开头的十进制数字表示。最大的可能值是定义的实现;然而,所有实现都应支持至少0到9(包括0到9)供应用程序使用。这些数字称为“文件描述符”。值0、1和2具有特殊含义和常规用途,并由某些重定向操作暗示;它们分别称为标准输入、标准输出和标准误差。程序通常从标准输入中获取输入,并将输出写入标准输出。错误消息通常写在标准错误上。重定向运算符前面可以有一个或多个数字(不允许插入字符),以指定文件描述符编号。
如果你是初学者,我觉得这很有帮助
更新:在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.指出
从程序员的角度来看,这意味着:
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完全错误,没有效果!