要将stderr和stdout合并到stdout流中,我们将其附加到命令中:

2>&1

例如,查看编译g++main.cpp时的前几个错误:

g++ main.cpp 2>&1 | head

2>&1的详细含义是什么?


当前回答

unix命令2>&1

这用于将错误打印到终端。

当产生错误时,它们将被写入内存地址&2的“标准错误”缓冲区,以及来自该缓冲区的2个引用和流。当产生输出时,它们被写入“标准输出”缓冲区的内存地址&1,以及来自该缓冲区的1个引用和流。

所以回到指挥部。每当程序unix_commands产生错误时,它都会将其写入错误缓冲区。因此,我们创建一个指向缓冲区2的指针,并将>错误重定向到输出缓冲区&1。此时我们就完成了,因为输出缓冲区中的任何内容都由终端读取和打印。

其他回答

这就像将错误传递到stdout或终端。

也就是说,cmd不是命令:

$cmd 2>filename
cat filename

command not found

错误被发送到文件,如下所示:

2>&1

标准错误被发送到终端。

如果系统上不存在/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

是速记

该构造将标准错误流(stderr)发送到标准输出(stdout)的当前位置——其他答案似乎忽略了这个货币问题。

您可以使用此方法将任何输出句柄重定向到另一个,但它最常用于将stdout和stderr流引导到单个流中进行处理。

例如:

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

请注意,最后一个命令不会将stderr重定向到outfile2,而是将其重定向到遇到参数时的stdout(outfile1),然后将stdout重定向到outile2。

这允许一些相当复杂的诡计。

我发现了这篇关于重定向的精彩文章:关于重定向

将标准输出和标准错误重定向到文件

$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)

重定向输入输入重定向导致文件名为将要打开以读取文件的单词展开的结果描述符n或标准输入(文件描述符0),如果n是未指定。重定向输入的一般格式为:[n] <单词重定向输出输出重定向导致文件name是将要打开以供书写的单词展开后的结果文件描述符n或标准输出(文件描述符1),如果n未指定。如果文件不存在,则创建该文件;如果它它被截断为零大小。重定向输出的一般格式为:[n] >单词移动文件描述符重定向运算符,[n] <数字(&D)-将文件描述符数字移动到文件描述符n,或如果未指定n,则为标准输入(文件描述符0)。数字在复制到n之后是闭合的。类似地,重定向运算符[n] >数字(&D)-将文件描述符数字移动到文件描述符n,或如果未指定n,则为标准输出(文件描述符1)。

Ref:

man bash

键入/^REDIRECT以定位到重定向部分,并了解更多信息。。。

这里有一个在线版本:3.6重定向

PS:

很多时候,人类是学习Linux的强大工具。