>/dev/null 2>&1 和 2>

2016-12-29  本文已影响26人  大飞哥

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

还有<<<,是输入重定向,
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来得高。

上一篇 下一篇

猜你喜欢

热点阅读