在Unix shell中,如果我想把stderr
和stdout
合并到stdout
流中,以便进一步操作,我可以在我的命令后面附加以下内容。
2>&1
因此,如果我想对g++
的输出使用head
,我可以这样做。
g++ lots_of_errors 2>&1 | head
这样我就可以只看到前几个错误。
我总是记不住,不断要去查,这主要是因为我不完全了解这种特殊技巧的语法。
谁能把它拆开来,逐一解释2>&1
的意思?
文件描述符1是标准输出(stdout
)。
文件描述符2是标准错误(stderr
)。
这里有一个记住这个结构的方法(尽管它并不完全准确):起初,2>1
可能看起来是一个将stderr
重定向到stdout
的好方法。然而,它实际上会被解释为"将stderr
重定向到一个名为1
的文件"。&
表示后面是一个文件描述符,而不是一个文件名。所以这个结构变成了。2>&1
。
echo test > afile.txt
将stdout重定向到afile.txt
。这与做
echo test 1> afile.txt
要重定向stderr,你要做的是。
echo test 2> afile.txt
>&
是将一个流重定向到另一个文件描述符的语法 - 0是stdin,1是stdout,2是stderr。
你可以通过以下方式将stdout重定向到stderr。
echo test 1>&2 # or echo test >&2
或反之亦然。
echo test 2>&1
所以,简而言之...2>
将stderr重定向到一个(未指定的)文件,附加&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工具使用了非标准的文件描述符来定制日志,所以你不会看到它,除非你把它重定向到一个文件或其他地方。