> /dev/null 2>&1 是如何工作的?

360*_*man 0 linux io-redirection shell-script stdout stderr

我了解重定向输出如何> /dev/null导致它不打印到屏幕。

但由于某种原因,这并不总是足够的,有些东西仍然会被打印出来。

在这些情况下> /dev/null 2>&1就会达到预期的结果。

然而这让我有点困惑。有人能详细解释一下这是如何工作的吗?

特别令人困惑的是这&1部分。如果我看到,&我会想到“在后台运行”。不知道1是什么意思,如果是2呢?

Edu*_*ani 6

shell 运行的程序获得三个流:

0 - standard input [stdin]
1 - standard output [stdout]
2 - standard error (output) [stderr]
Run Code Online (Sandbox Code Playgroud)

您可以将stdin其视为键盘(没有管道或重定向,这是一种简化)。

然后,要在屏幕上打印内容,每个程序都可以写入标准输出或标准错误,通常正常输出转到stdout,错误输出到stderr

当您重定向时,>您只是重定向标准输出。你可以使用1>.

当您重定向时,2>您只是重定向 stderr。

因此,如果你的程序打印了一些东西stderr,而你只做了:

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

你仍然会看到它。

您至少有两种解决方案来避免看到stderr输出,重定向stdoutstderr/dev/null

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

或者,这是您问题的答案,重定向stderrstdout,它已经重定向到/dev/null

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

这就是2>&1重定向stderrstdout. Bash 从右向左阅读,这就是它出现在最后的原因。