had*_*des 1 shell bash io-redirection
我在 linux 脚本中看到有一个命令参数> /dev/null 2>&1,我知道它是将输出重定向到 null,意味着将其静音。我也知道 0,1,2(STDIN、STDOUT、STDERR)的编号,但我不明白为什么需要这条线?
2>&1
Run Code Online (Sandbox Code Playgroud)
基本上我想知道有什么区别
>/dev/null
Run Code Online (Sandbox Code Playgroud)
和
>/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
Pan*_*dya 11
2>&1将 stderr 重定向到 stdout 当前指向的任何地方。该参数>/dev/null将重定向标准输出,/dev/null即通过命令丢弃/静默输出。但是,如果您还想丢弃(静音)stderr,则在将 stdout 重定向到 后/dev/null,指定2>&1将 stderr 重定向到同一位置。
示例(用于可视化差异):
$ ls
file1
file2
Run Code Online (Sandbox Code Playgroud)
$ ls file1 > /dev/null
$
Run Code Online (Sandbox Code Playgroud)
这里的输出ls file1就是file1被发送到/dev/null,因此我们什么也得不到。但:
$ ls file12 > /dev/null
ls: cannot access file12: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这给出了 stderr 并且只有输出被发送到/dev/null. 因此,如果您也想丢弃/静默 stderr,那么您可以将 stderr 重定向到 stdout,因此两者都将按/dev/null如下方式发送:
$ ls file12 >/dev/null 2>&1
$
Run Code Online (Sandbox Code Playgroud)
请注意,重定向的顺序很重要。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 当前指向的同一位置。>&简单地使用like:ls file12 >& /dev/null将 stdout 和 stderr 重定向到/dev/null