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

Mat*_*ins 70 shell redirection command-line

我知道该>符号用于命令行中的输出重定向,但我无法找到解释2>&1命令行中使用的内容。例如:

curl http://www.google.com > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

Che*_*ion 87

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

所以2>&1说将标准错误发送到标准输出也被重定向的地方。因为它被发送到/dev/null类似于完全忽略任何输出。

  • 可以这样想:如果只有“1”而没有 & 符号,shell 将创建一个名为“1”的文件并将 stderr 输出重定向到它。 (13认同)
  • 因为`0`(stdin)、`1`(stdout)和`2`(stderr)实际上是文件描述符,shell需要在它们前面加上一个符号来重定向。在这种情况下,它复制文件描述符,有效地将两个信息流合并在一起。 (9认同)
  • 与号出现在 1 之前而不是 2 之前是否有原因?我认为 & 是在后台运行作业的保留字符,但我想只有当&符号在命令末尾显示为长字符时......? (3认同)

Jor*_*ran 32

tl;博士

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)
Run Code Online (Sandbox Code Playgroud)

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

卷曲结果

重定向

就像你说的<>用于将命令的输出重定向到其他地方,比如文件。

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

> /dev/null 2>&1

第一部分> /dev/nullstdout,即curl的输出重定向到/dev/null(前面有更多内容)并将2>&1重定向stderrstdout(刚刚重定向到/dev/null因此所有内容都将发送到/dev/null)。

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

/开发/空

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

> /开发/空

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

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

最后

&在你到底是怎么告诉shell作为运行命令工作背景。当命令在后台异步运行时,这会导致提示立即返回。jobs在您的终端中查看当前的作业类型。请注意,这与系统中运行的进程不同top在终端中查看那些类型。

参考

  • 从布局的角度来看,这是整个网站上最好的答案之一,做得好! (2认同)

Joh*_*n T 5

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