360*_*man 0 linux io-redirection shell-script stdout stderr
我了解重定向输出如何> /dev/null
导致它不打印到屏幕。
但由于某种原因,这并不总是足够的,有些东西仍然会被打印出来。
在这些情况下> /dev/null 2>&1
就会达到预期的结果。
然而这让我有点困惑。有人能详细解释一下这是如何工作的吗?
特别令人困惑的是这&1
部分。如果我看到,&
我会想到“在后台运行”。不知道1是什么意思,如果是2呢?
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
输出,重定向stdout
和stderr
/dev/null
program > /dev/null 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
或者,这是您问题的答案,重定向stderr
到stdout
,它已经重定向到/dev/nul
l
program > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
这就是2>&1
重定向stderr
到stdout
. Bash 从右向左阅读,这就是它出现在最后的原因。
归档时间: |
|
查看次数: |
6417 次 |
最近记录: |