# 区别:
2>/dev/null |
意思就是把错误输出到 “黑洞”
>/dev/null 2>&1 |
默认情况是 1,也就是等同于 1>/dev/null 2>&1。意思就是把标准输出重定向到 “黑洞”,还把错误输出 2 重定向到标准输出 1,也就是标准输出和错误输出都进了 “黑洞”
2>&1 >/dev/null |
意思就是把错误输出 2 重定向到标准出书 1,也就是屏幕,标准输出进了 “黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕
# 解释:
文件描述符
Linux 系统预留三个文件描述符:0、1 和 2,他们的意义如下所示:
0—— 标准输入(stdin)
略...
1—— 标准输出(stdout)
在当前目录下,有且只有一个文件名称为 a.txt 的文件,这时我们运行这个命令【ls a.txt】, 就会获得一个标准输出 stdout 的输出结果:a.txt
2—— 标准错误(stderr)
在当前目录下,有且只有一个文件名称为 a.txt 的文件,我们运行命令【ls b.txt】,我们就会获得一个标准错误 stderr 的输出结果 “ls:无法访问 b.txt:没有这样的文件或目录”。重定向
重定向的符号有两个:> 或 >>,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。举例如下:
重定向标准输出 stdout
如上图所示,对比没有添加重定向的操作,这条命令在使用之后并没有将 a.txt 打印到屏幕。在紧接的 cat 操作后,可以发现本来应该被输出的内容被记录到 stdout.txt 中。重定向标准错误 stderr
如上图所示,文件描述符 2,标准错误的重定向也是同样的原理被记录在了文件 stderr.txt 这个文件里面了。可以将 stderr 单独定向到一个文件,stdout 重定向到另一个文件
ls b.txt 2> stderr.txt 1>stdout.txt |
- 也可以将 stderr 和 stdout 重定向到同一个文件
ls b.txt > output.txt 2>&1 |
- 或采用下面的方法,可以少写几个字,能达到同样的效果
ls b.txt &> output.txt | |
ls b.txt >& output.txt #两个表达式效果一样的 |
- Linux 特殊文件
/dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null 这个设备通常也被称为位桶(bit bucket)或黑洞。
所以,2>/dev/null 的意思就是将标准错误 stderr 删掉。