要将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的详细含义是什么?
当前回答
你需要从管道的角度来理解这一点。
$ (whoami;ZZZ) 2>&1 | cat
logan
ZZZ: command not found
正如您所看到的,管道LHS的stdout和stderr都被送入(管道的)RHS。
这与
$ (whoami;ZZZ) |& cat
logan
ZZZ: command not found
其他回答
如果系统上不存在/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
是速记
这就像将错误传递到stdout或终端。
也就是说,cmd不是命令:
$cmd 2>filename
cat filename
command not found
错误被发送到文件,如下所示:
2>&1
标准错误被发送到终端。
0表示输入,1表示标准输出,2表示标准错误。
一个提示:somecmd>1.text 2>&1是正确的,而somecmd2>&1>1.text完全错误,没有效果!
unix命令2>&1
这用于将错误打印到终端。
当产生错误时,它们将被写入内存地址&2的“标准错误”缓冲区,以及来自该缓冲区的2个引用和流。当产生输出时,它们被写入“标准输出”缓冲区的内存地址&1,以及来自该缓冲区的1个引用和流。
所以回到指挥部。每当程序unix_commands产生错误时,它都会将其写入错误缓冲区。因此,我们创建一个指向缓冲区2的指针,并将>错误重定向到输出缓冲区&1。此时我们就完成了,因为输出缓冲区中的任何内容都由终端读取和打印。
从程序员的角度来看,这意味着:
dup2(1, 2);
请参见手册页。
了解2>&1是副本也解释了为什么。。。
command >file 2>&1
…与…不同。。。
command 2>&1 >file
第一个将两个流发送到文件,而第二个将错误发送到stdout,并将普通输出发送到文件。