要将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。
其他回答
要将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。
0表示输入,1表示标准输出,2表示标准错误。
一个提示:somecmd>1.text 2>&1是正确的,而somecmd2>&1>1.text完全错误,没有效果!
2是控制台标准错误。
1是控制台标准输出。
这是标准的Unix,Windows也遵循POSIX。
例如,当您跑步时
perl test.pl 2>&1
标准错误被重定向到标准输出,因此您可以同时看到两个输出:
perl test.pl > debug.log 2>&1
执行后,您可以在debug.log中看到所有输出,包括错误。
perl test.pl 1>out.log 2>err.log
然后标准输出转到out.log,标准错误转到err.log。
我建议你试着理解这些。
如果你是初学者,我觉得这很有帮助
更新:在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.指出
如果系统上不存在/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
是速记