在 bash 脚本中输出到 /dev/null 有什么作用?

jav*_*nix 157 command-line bash scripts redirect

我经常遇到在 if 语句中使用这种语法的小型 bash 脚本:

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

/dev/null这样输出的目的是什么,什么2>&1意思?

它似乎总是有效,但我想知道它在做什么。

Joã*_*nto 199

>/dev/null 将命令标准输出重定向到空设备,这是一个特殊的设备,它会丢弃写入其中的信息

2>&1将标准错误流重定向到标准输出流(stderr = 2,stdout = 1)。请注意,这需要标准错误流并将其指向与标准输出相同的位置。这就是顺序的原因,>/some/where 2>&1因为如果最后想要合并两个流,则需要首先将 stdout 指向某个地方,然后将 stderr 指向同一位置。

实际上,它会阻止显示命令的任何输出(stdout 和 stderr)。当您不关心命令输出时使用它。

  • @Nobody "& 表示后面的内容是文件描述符而不是文件名。" /sf/answers/57279911/ (21认同)
  • 1 之前的 `&` 在 `2 >&1` 中表示什么 (3认同)

Sid*_*Sid 74

STDIN 用 0 表示,STDOUT 用 1 表示,STDERR 用 2 表示。

/dev/null是位桶:您可以转储不需要的任何东西的地方。


因此,STDOUT 被重定向到 bit-bucket(trash),而 STDERR 被重定向到 STDOUT 所在的位置:bit-bucket。


你也可以这样做:

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

  • 很好的解释。我也认为上面有一个快捷方式:&> /dev/null (10认同)
  • 快捷键 `&>` 和 `>&` 有点不受欢迎,因为它们是“bashism”——它们确实与 `bash` shell 一起工作,但与其他一些 POSIX 兼容 shell 不兼容。`>... 2>&1 ...` 语法适用于每个 POSIX 兼容的 shell。 (4认同)