">/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>&1
和anycommands 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
未显示,stderr
在 stdout
案例#3:(echo stdout; echo stderr >&2) 2> /dev/null >&2
与案例#1 相同,stderr
和 stdout
已互换角色
如果您只使用 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
相关联的顺序,这与命令在 运行 时的状态无关。在这两种情况下,两个流都被重定向到位桶。
我有一个关于重定向的问题。
当我不需要任何输出时,我总是使用 anycommands > /dev/null 2>&1
。但是我没用过anycommands 2> /dev/null >&2
问题:哪一个是期望没有输出的最佳方式? anycommands > /dev/null 2>&1
和anycommands 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
未显示,stderr
在stdout
案例#3:(echo stdout; echo stderr >&2) 2> /dev/null >&2
与案例#1 相同,stderr
和 stdout
已互换角色
如果您只使用 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
相关联的顺序,这与命令在 运行 时的状态无关。在这两种情况下,两个流都被重定向到位桶。