>/dev/null 2>&1 和 2>&1 >/dev/null的区别

>>>,是输入输出重定向,前者是覆盖,后者是追加。

还有<<<,是输入重定向,
command <filename 或者 command 0<filename 以filename文件作为标准输入
command <<delimiter 从标准输入中读入,直到遇到delimiter分隔符

& 是 重定向绑定

>/dev/null 2>&1 将标准输出重定向到空设备, 然后将错误输出保定到标准输出,这样,错误输出也是重定向到空设备

2>&1 >/dev/null 先将错误输出绑定到标准输出,因为此时,标准输出还没有重定向,所以是默认输出,屏幕,然后将标准输出重定向到空设备。这样,结果就是,标准输出重定向到空设备,错误输出到屏幕。

命令 标准输出 错误输出
>/dev/null 2>&1 丢弃 丢弃
2>&1 >/dev/null 丢弃 屏幕

那么为什么要用重定向绑定,而不是像>/dev/null 2>/dev/null这样子重复一遍呢?
例子

# ls a.txt b.txt >out 2>out
# cat out
a.txt
无法访问b.txt: 没有那个文件或目录

这是因为采用这种写法,标准输出和错误输出会抢占往out文件的管道,所以可能会导致输出内容的时候出现缺失、覆盖等情况。
而且,由于out文件被打开了两次,两个文件描述符会抢占性的往文件中输出内容,所以整体IO效率不如>/dev/null 2>&1来得高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容