2>/dev/null 是什么意思?

Nai*_*ive 354 command-line bash redirect stdout

我想简要说明以下命令行:

grep -i 'abc' content 2>/dev/null 
Run Code Online (Sandbox Code Playgroud)

War*_*ill 500

>操作者输出通常重定向到一个文件,但它可以是一个设备。您也可以使用>>追加。

如果您不指定数字,则假定为标准输出流,但您也可以重定向错误:

> file将标准输出重定向到文件
1> file将标准输出重定向到文件

2> file 将 stderr 重定向到文件

&> file将 stdout 和 stderr
> file 2>&1重定向到文件将 stdout 和 stderr 重定向到文件

/dev/null是空设备,它接受您想要的任何输入并将其丢弃。它可用于抑制任何输出。

请注意,这> file 2>&1是一个仍然有效的旧语法,&> file更简洁,但不适用于旧系统。

  • 在今天的实践中,我不认为 `2>&1` 是一种较旧的语法,因此 `&>` 几年前不会起作用,但两者是等效的。 (25认同)
  • `> /dev/null 2>&1` 和 `&> /dev/null` 之间有区别吗 (19认同)

Ter*_*ang 38

简而言之,它将stderrfd2)重定向到黑洞(丢弃命令的输出)。

一些常用的重定向模式:

command > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

command在后台运行,丢弃stdoutstderr

command >> /path/to/log 2>&1 &
Run Code Online (Sandbox Code Playgroud)

运行command,附加stdoutstderr到日志文件。

在 Bash 4+ 中,更短(但可读性较差)的形式是功能性的

command &>> /path/to/log
Run Code Online (Sandbox Code Playgroud)

  • @CraigMcQueen `&>` 是 Bash 4 中的新功能,前者只是传统方式,我已经习惯了(容易记住)。 (9认同)
  • 是否有充分的理由使用 `> /dev/null 2>&1` 而不是 `&> /dev/null`? (5认同)
  • 为什么是 2>&1 而不是 2&1> ?? (3认同)

小智 15

/dev/null在 Linux/Unix 中被视为黑洞,因此​​您可以将任何内容放入其中,但无法从/dev/null.

此外,2>意味着您正在将(即>)stderr(即2)重定向到黑洞(即/dev/null

你的命令是:

grep -i 'abc' content 2>/dev/null 
Run Code Online (Sandbox Code Playgroud)

不要尝试以这样的另一个正斜杠结尾 - 2>/dev/null/(它不是目录)。


小智 7

grep -i 'abc' content 将生成显示在控制台上的输出,包括任何错误。

指定2>/dev/null将过滤掉错误,以便它们不会输出到您的控制台。

更详细地说: 2 表示错误描述符,这是写入错误的地方。默认情况下,它们会打印在控制台上。

\> 将输出重定向到指定的位置,在这种情况下 /dev/null

/dev/null 是标准 Linux 设备,您可以在其中发送要忽略的输出。


小智 5

首先我们需要谈谈>运营商。它将符号左侧的输出重定向到符号右侧。

所以它必须被认为是:

源命令 > 目标文件

其他我们必须知道的事情

0 means stdin 
1 means stdout(useful output)
2 means stderr(error message output)
Run Code Online (Sandbox Code Playgroud)

默认情况下,它的工作方式如下command 1 > target_file

至于/dev/null--> 它是一个特殊文件,会丢弃指向它的通道输出重定向。

所以在你的问题中这意味着

运行该命令,不要向我显示错误消息将其丢弃

  • 了解不同描述符的含义对于获得更多上下文非常有用,并且节省了我额外的谷歌搜索。 (2认同)