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


28

这对我来说没有意义。

wibble > /dev/null 2>&1

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

wibble 2>&1 > /dev/null

换一种说法

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

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


6
您可能还会发现此说明有用。
rozcietrzewiacz 2011年

感谢@rozcietzewiacz,它实际上完全解释了我的问题
whoami

1
Greg Wiki上该页面的中间有一段很棒的段落:“如果此时您仍然感到困惑,那可能是因为您开始对FD的工作方式有误解,而您仍无法消除这种误解。然而。别担心-这是一个非常普遍的误解,而且您并不孤单。…许多人认为这2>&1两个FD以某种方式“联合”或“联系在一起”或“结婚”,因此对其中一个的任何[后续]更改都变成了对另一个FD的更改。情况并非如此。”
G-Man说'Resstate Monica''15

Answers:


40

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

2>&1 1> /dev/null

第一个重定向使stderr指向当时指向的流stdout(本质上是您的tty)。它没有作为stderr的别名stdout

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

所以:

ls file_that_doesnt_exist 2>&1 1> /dev/null

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

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

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

          ls > dirlist 2>&1

将标准输出和标准错误都定向到文件目录,同时命令

          ls 2>&1 > dirlist

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


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

1
应该强调的是,您所讨论的页面是Bash参考手册的一部分。显然,它描述了bash。还有其他的壳在世界上,从bash的不同,&>>&(当在上下文不使用2>&1>&2等)的bash-主义并且不标准。它们不应在要移植的shell脚本中使用。
G-Man说'恢复莫妮卡'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.