>
和>>
,是输入输出重定向,前者是覆盖,后者是追加。
还有<
和<<
,是输入重定向,
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来得高。