为什么以这种方式将 STDERR 重定向到 /dev/null?

who*_*ami 29 io-redirection

这对我来说没有意义。

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

我认为如果是这样的话会更有意义:

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

换句话说

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null
Run Code Online (Sandbox Code Playgroud)

命令重定向顺序背后的想法是什么xxx > /dev/null 2>1

Mat*_*Mat 41

重定向是从左到右处理的。如果你这样做

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

第一个重定向stderr指向当时指向的流stdout(本质上是您的 tty)。它不会stderrstdout.

然后stdout被重定向到位桶。该stdout重定向不影响以前的stderr重定向。stderr仍然是指您的 tty。

所以:

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

将仅在您的终端上打印错误消息。

bash重定向文档页面提到了这一点明确:

请注意,重定向的顺序很重要。例如,命令

          ls > dirlist 2>&1
Run Code Online (Sandbox Code Playgroud)

将标准输出和标准错误都指向文件 dirlist,而命令

          ls 2>&1 > dirlist
Run Code Online (Sandbox Code Playgroud)

仅将标准输出定向到文件 dirlist ,因为在将标准输出重定向到 dirlist 之前,标准错误已从标准输出复制

  • 耶解决了我的难题。我仍然认为在逻辑上它令人困惑。但我发现同一页面上的另一部分很有趣 `&>/dev/null` 在语义上等同于 `/dev/null 2>&1` (3认同)