为什么我们需要在 /dev/null 2>&1 中有 2>&1 ?

为什么我们需要在 /dev/null 2>&1 中有 2>&1 ?

我在linux脚本中看到有一个命令参数> /dev/null 2>&1,我知道它是将输出重定向到null,意味着将其静音。我也知道 0,1,2(STDIN、STDOUT、STDERR)的编号,但我不明白为什么需要这条线?

2>&1

基本上我想知道有什么区别

>/dev/null

>/dev/null 2>&1

答案1

2>&1将 stderr 重定向到 stdout 当前指向的位置。该参数>/dev/null将重定向标准输出,即/dev/null通过命令丢弃/静默输出。但如果您还想丢弃(使其静默)stderr,则在将 stdout 重定向到 后/dev/null,指定2>&1将 stderr 重定向到同一位置。

示例(用于可视化差异):

$ ls
file1
file2

$ ls file1 > /dev/null
$

这里的输出ls file1file1被发送到的/dev/null,因此我们什么也得不到。但:

$ ls file12 > /dev/null
ls: cannot access file12: No such file or directory

这给出了 stderr ,因为只有输出被发送到/dev/null.所以,如果您还想丢弃/静默 stderr,则可以将 stderr 重定向到 stdout,因此两者都将发送到/dev/null如下:

$ ls file12 >/dev/null 2>&1
$

笔记重定向的顺序/顺序很重要。2>&1重定向标准错误必须始终放置在重定向标准输出之后,否则它不会执行任何操作。在上面的示例中,如果运行,ls file12 2>&1 >/dev/null您将看到 stderr 打印到终端;如果你跑,ls file12 >/dev/null 2>&1你就不会。

  • 或者,您也可以使用ls file1 file12 2>/dev/null 1>&2相同的效果 - 首先将 stderr 重定向到/dev/null,然后将 stdout 重定向到指向 stderr 当前指向的同一位置。
  • 使用新版本的 bash,您还可以使用>&就像:ls file12 >& /dev/null它将 stdout 和 stderr 重定向到/dev/null

答案2

someprogram > /dev/null 2>&1工作原理是将标准输出 ( &1) 重定向到/dev/null,然后将标准错误 ( ) 重定向到已重定向到的&2同一位置。&1如果您不重定向 stderr,那么虽然标准输出将被消除,但标准错误仍将被发送到终端。

相关内容