我只是想知道如何知道我们通常在shell 命令中首先放置哪条指令? 例如, 为什么使用该命令:
ls -l file_doesnot_exists > /dev/null 2>&1
个
正在工作,而此命令:
ls -l 2>&1 file_doesnot_exists > /dev/null
个
不是
我只是想知道如何知道我们通常在shell 命令中首先放置哪条指令? 例如, 为什么使用该命令:
ls -l file_doesnot_exists > /dev/null 2>&1
个
正在工作,而此命令:
ls -l 2>&1 file_doesnot_exists > /dev/null
个
不是
注:
linux
,这意味着ls
是PowerShell自己的Get-ChildItem
cmdlet(仅适用于Windows)的内置别名not,而是指标准的/bin/ls
Unix实用程序.在PowerShell中,您的命令之间有no个差异,因为order of 100 does NOT matter.
所有目标output streams始终保持其身份:流的任何重定向都会影响同一命令中到相同流的任何其他重定向.
因此,neither of your commands work as intended and produce no output,因为虽然2>&1
将错误流(2
)重定向到成功输出流(1
),但由于> /dev/null
(>
与1>
相同),后者的输出最终是discarded,including是重定向的错误流输出.
相比之下,在POSIX-compatible shells such as Bash中,order of redirections DOES matter:
ls -l 2>&1 file_doesnot_exists > /dev/null
WORKS按计划:
2>&1
将stderr输出重定向到original标准输出.>
与1>
相同)对2>&1
有no影响/dev/null
).相比之下,ls -l file_doesnot_exists > /dev/null 2>&1
和DOES NOT的yields 为no output:
> /dev/null
将标准输出重定向到/dev/null
,即有效地discards标准输出.
因为在命令中2>&1
等于later,所以1
引用already redirected标准输出,因此stderr输出也被丢弃.
有关详细信息,请参阅this answer.