在命令行中“ 2>&1”有什么作用?


Answers:


78

1表示标准输出(stdout)。的2表示标准错误(错误)。

所以2>&1说将标准错误发送到标准输出也要重定向到的地方。既然被发送到,/dev/null就好像完全忽略了任何输出。


2
是否有理由在“ 1”之前而不是“ 2”之前出现“&”号?我以为&是在后台运行作业的保留字符,但我猜只有在&符在命令末尾显示为长字符时...?
马特·哈金斯

8
因为0(stdin),1(stdout)和2(stderr)实际上是文件描述符,所以外壳程序需要在它们前面加上一个&符才能进行重定向。在这种情况下,它会复制文件描述符,从而有效地将两个信息流合并在一起。
Chealion

12
可以这样考虑:如果您只有“ 1”而没有“&”号,那么外壳程序将创建一个名为“ 1”的文件并将stderr输出重定向到该文件。
CarlF

1
好吧,仅此一项是否有效?curl http://www.google.com 2>/dev/null命令行如何知道这里的“ 2”旨在表示stderr,实际上不是我要传递给curl命令的第二个参数?
马特·哈金斯

1
@Matt Huggins:是的。那将把所有输出从stderr直接发送到/dev/null。您可以通过尝试在实践中看到它curlcurl 1>/dev/nullcurl 2>/dev/null只是看到输出更改。同样,&符号仅在重定向到文件描述符时才需要。
Chealion

23

tl; dr

http://www.google.com后台抓取并丢弃stdoutstderr

curl http://www.google.com > /dev/null 2>&1 &

是相同的

curl http://www.google.com > /dev/null 2>/dev/null &

基本

012表示标准文件描述符POSIX操作系统。文件描述符是(基本上)对文件或套接字的系统引用。

在C中创建一个新的文件描述符可能看起来像这样:

fd = open("data.dat", O_RDONLY)

大多数Unix系统命令都会接受一些输入并将结果输出到终端。curl将获取指定网址(google dot com)上的任何内容,并将结果显示到stdout

卷曲结果

重新导向

如您所说<>用于将命令的输出重定向到其他位置,例如文件。

例如,在中ls > myfiles.txtls获取当前目录的内容>并将其输出重定向到myfiles.txt(如果文件不存在,则创建该文件,否则将其覆盖,但是可以使用>>代替将>其附加到文件中)。如果运行上面的命令,您将注意到终端上没有任何显示。这通常意味着在Unix系统中取得成功。选中此项cat myfiles.txt以在屏幕上显示文件内容。

> / dev / null 2>&1

第一部分> /dev/null重定向stdout,这是curl的输出/dev/null(关于这一点前面),并2>&1重定向stderrstdout(只重定向到/dev/null所以一切都将被发送到/dev/null)。

左侧2>&1告诉你什么将被重定向,并且右侧会告诉你哪里来。将&用于右侧区分stdout (1)stderr (2)从指定的文件12。因此,2>1最终将创建一个名为(如果尚不存在)新文件1,并将stderr结果转储到该文件中。

/ dev /空

/dev/null是一个空文件,一种用于丢弃写入其中的所有内容的机制。因此, curl http://www.google.com > /dev/null有效抑制了curl输出。

> / dev / null

但是,为什么终端上仍然显示某些内容?这不是 curl常规输出,而是发送到的数据stderr,这里用于显示进度和诊断信息,而不仅仅是错误

curl http://www.google.com > /dev/null 2>&1忽略curl的输出和curl进度信息。结果是终端上什么也没有显示。

最后

最后&,您将告诉外壳程序如何在后台将命令作为作业运行。这将导致提示在后台异步运行命令时立即返回。要查看当前作业,请在终端中输入。请注意,这与系统中运行的进程不同。要查看这些,请在终端中输入。jobstop

参考文献


1
从布局的角度来看,这是整个网站上最好的答案之一,做得好!
OmarOthman '16

我没有得到的一件事是为什么您想将所有内容发送给/dev/null?您不希望curl至少某处的结果有用吗?
skube

@skube对。在这种情况下,我不清楚用户为什么要同时丢弃stdout和stderr。OP可能只是想了解语法的含义。
Jorge Bucaran

5

2指STDERR。2>&1会将STDERR发送到与1(STDOUT)相同的位置。


0

我的理解如下:

如果只想读取屏幕上命令的输出和错误信息,则只需编写: curl http://www.google.com

有时您想将输出信息保存到文件中,而不是保存到终端屏幕中以供以后查看,然后可以编写: curl http://www.google.com > logfile

但是通过这种方式,由于>仅将StdOut重定向到,因此将省略StdErr信息logfile

因此,如果您担心命令执行失败后的错误信息,则需要使用来组合StdOut和StdErr 2>&1(这意味着将StdErr折叠成StdOut),因此可以编写以下命令行: curl http://www.google.com > logfile2>&1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.