要将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或终端。
也就是说,cmd不是命令:
$cmd 2>filename
cat filename
command not found
错误被发送到文件,如下所示:
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工具,这些工具使用非标准文件描述符进行自定义日志记录,因此除非将其重定向到文件或其他文件,否则您不会看到它。
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。
我建议你试着理解这些。
要将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。
我发现了这篇关于重定向的精彩文章:关于重定向
将标准输出和标准错误重定向到文件
$command&>文件
这一行程序使用&>运算符将输出流stdout和stderr从命令重定向到文件。这是Bash将两个流快速重定向到同一目的地的快捷方式。
以下是Bash重定向两个流后文件描述符表的样子:
如您所见,stdout和stderr现在都指向文件。所以任何写入stdout和stderr的内容都会写入文件。
有几种方法可以将两个流重定向到同一目标。您可以逐个重定向每个流:
$command>文件2>&1
这是将两个流重定向到文件的更常见的方法。首先将stdout重定向到文件,然后复制stderr以与stdout相同。所以两个流都指向文件。
当Bash看到几个重定向时,它会从左到右处理它们。让我们来看看这些步骤是如何实现的。在运行任何命令之前,Bash的文件描述符表如下所示:
现在Bash处理第一个重定向>文件。我们以前见过这个,它使stdout指向文件:
下一个Bash看到第二个重定向2>&1。我们以前从未见过这种重定向。这一个将文件描述符2复制为文件描述符1的副本,我们得到:
两个流都已重定向到文件。
不过,这里要小心!写
命令>文件2>&1
与书写不同:
$command 2>&1>文件
重定向的顺序在Bash中很重要!此命令仅将标准输出重定向到文件。stderr仍将打印到终端。为了理解为什么会发生这种情况,让我们再次重复这些步骤。因此,在运行该命令之前,文件描述符表如下所示:
现在Bash处理从左到右的重定向。它首先看到2>&1,因此将stderr复制到stdout。文件描述符表变为:
现在Bash看到了第二个重定向>文件,它将stdout重定向到文件:
你看到这里发生了什么吗?标准输出现在指向文件,但标准错误仍然指向终端!写入stderr的所有内容仍然会打印到屏幕上!所以在重定向的顺序上要非常非常小心!
还要注意,在Bash中
$command&>文件
与以下内容完全相同:
$命令>文件(&F)
如果系统上不存在/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
是速记