">/dev/null 2>&1" 和 "2>/dev/null >&2" 有什么区别

What's the difference between ">/dev/null 2>&1" and "2>/dev/null >&2"

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

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

有什么区别

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

  • stdout(1) 被 fd 替换为 /dev/null
  • stderr(2) 描述符从 &1 复制到 /dev/null
  • 结果:完全没有输出

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

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

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

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

如果您只使用 BASH,请使用 &> 重定向标准输出和标准错误。这是最紧凑、最安全、最简单的解决方案。

关于你的问题,第一个等同于 &>(它将 stdout 和 stderr 都重定向到 /dev/null

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

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