为什么执行`ls not_existing_file 2>&1 > log.txt`时log.txt为空
问题原因
这是shell重定向的执行顺序导致的,shell会从左到右依次执行重定向规则,你给出的命令执行逻辑如下:
- 先执行
2>&1:此时标准输出(stdout)还未被重定向,默认指向终端,所以这一步会把标准错误(stderr)的输出指向也设为终端 - 再执行
> log.txt:这一步才将标准输出的指向修改为log.txt文件,但之前已经绑定到终端的标准错误不会同步变更指向
你执行的ls not_existing_file命令因为目标文件不存在,所有输出内容都走标准错误通道,最终错误内容输出到了终端,标准输出没有任何内容,所以写入log.txt的内容为空。
正确写法
如果要把标准输出和标准错误都重定向到同一个文件,有两种常用写法:
- 调整重定向顺序,先把stdout指向文件,再把stderr绑定到stdout:
ls not_existing_file > log.txt 2>&1 - 如果你使用Bash、Zsh等支持简化语法的shell,可以直接用合并重定向语法:
ls not_existing_file &> log.txt
内容的提问来源于stack exchange,提问作者zwithouta
相关产品推荐
相关产品推荐

