我在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 file1
是file1
被发送到的/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,那么虽然标准输出将被消除,但标准错误仍将被发送到终端。