Shell命令重定向顺序疑问:为何两种ls重定向指令效果不同?
Shell命令重定向的执行顺序规则解析
Shell在执行命令主体前,会从左到右依次处理所有重定向操作,每个重定向的生效逻辑完全依赖于处理它那一刻的文件描述符状态——这就是你遇到两个命令行为差异的核心原因。
正确生效的命令:ls -l file_doesnot_exists > /dev/null 2>&1
Shell的处理步骤是:
- 先处理
> /dev/null:将标准输出(文件描述符1)的指向改为/dev/null(丢弃输出)。 - 再处理
2>&1:将标准错误(文件描述符2)的指向复制为当前1的指向,也就是/dev/null。
最终,命令的标准输出和错误输出都会被丢弃,终端不会显示任何信息。
无法达到预期的命令:ls -l 2>&1 file_doesnot_exists > /dev/null
Shell的处理步骤是:
- 先处理
2>&1:此时1还是默认的终端输出,所以2被重定向到终端(和当前1的指向一致)。 - 再处理
> /dev/null:将1的指向改为/dev/null,但这一修改不会影响已经设置好的2——2仍然指向终端。
最终,标准输出被丢弃,但错误信息会直接打印到终端,这就是它不符合你预期的原因。
关键提醒
2>&1的作用是复制当前文件描述符1的指向,而不是建立“动态绑定”。后续对1的修改不会回溯影响已经完成的2的重定向设置。
内容的提问来源于stack exchange,提问作者HamzaDevXX
相关产品推荐
相关产品推荐

