“> / dev / null 2>& 1”和“2> / dev / null>& 2”之间有什么区别

时间:2015-01-23 07:45:05

标签: linux shell

我有一个重定向问题。 当我不需要任何输出时,我总是使用anycommands > /dev/null 2>&1。但我从未使用anycommands 2> /dev/null >&2

问题:哪一种是期望没有产出的最佳方法? anycommands > /dev/null 2>&1anycommands 2> /dev/null >&2

之间的区别是什么?

3 个答案:

答案 0 :(得分:2)

情况#1:(echo stdout;echo stderr>&2) >/dev/null 2>&1

  • stdout(1)被fd替换为/dev/null
  • stderr(2)描述符从&1复制,现在是fd到/dev/null
  • 结果:根本没有输出

例#2:(echo stdout;echo stderr>&2) 2>&1 >/dev/null

  • stderr(2)描述符是从&1复制的,这是默认的stdout
  • stdout(1)被fd替换为/dev/null
  • 结果:stderr为空,stdout未显示,stderr stdout

案例#3:(echo stdout; echo stderr >&2) 2> /dev/null >&2

与案例#1相同,stderrstdout已切换角色

答案 1 :(得分:1)

实际上,这两者是等价的。 cmd > /dev/null 2>&1将命令的stdout连接到/dev/null,然后将stderr连接到同一文件。 cmd 2>/dev/null >&2将stderr连接到/dev/null,然后将stdout连接到它。唯一的区别在于两个流与/dev/null关联的顺序,它与运行时命令的状态无关。在这两种情况下,两个流都被重定向到位桶。

答案 2 :(得分:-1)

如果您只使用BASH,请使用&>重定向stdout和stderr。这是最紧凑,安全和简单的解决方案。

关于您的问题,第一个问题相当于&>(它将stdout和stderr重定向到/dev/null

第二个将stderr连接到/dev/null并将stdout重定向到新的stderr,因此就输出而言它等效。只是文件描述符操作的顺序是相反的。