要将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的详细含义是什么?
当前回答
文件描述符1是标准输出(stdout)。文件描述符2是标准错误(stderr)。
首先,2>1可能是将stderr重定向到stdout的好方法。然而,它实际上会被解释为“将stderr重定向到名为1的文件”。
&指示后面和前面的是文件描述符,而不是文件名。因此,我们使用2>&1。考虑>&成为重定向合并运营商。
其他回答
这些数字表示文件描述符(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工具,这些工具使用非标准文件描述符进行自定义日志记录,因此除非将其重定向到文件或其他文件,否则您不会看到它。
要将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。
文件描述符1是标准输出(stdout)。文件描述符2是标准错误(stderr)。
首先,2>1可能是将stderr重定向到stdout的好方法。然而,它实际上会被解释为“将stderr重定向到名为1的文件”。
&指示后面和前面的是文件描述符,而不是文件名。因此,我们使用2>&1。考虑>&成为重定向合并运营商。
0表示输入,1表示标准输出,2表示标准错误。
一个提示:somecmd>1.text 2>&1是正确的,而somecmd2>&1>1.text完全错误,没有效果!
你需要从管道的角度来理解这一点。
$ (whoami;ZZZ) 2>&1 | cat
logan
ZZZ: command not found
正如您所看到的,管道LHS的stdout和stderr都被送入(管道的)RHS。
这与
$ (whoami;ZZZ) |& cat
logan
ZZZ: command not found