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