详细理解 > /dev/null 2>&1

0:表示键盘输入(stdin)
1:表示标准输出(stdout),系统默认是1
2:表示错误输出(stderr)


"command >/dev/null 2>&1 &"  与 "command 1>/dev/null 2>&1 &"  的意思一样


1) command:    表示shell命令或者为一个可执行程序
2) >:       表示重定向到哪里
3) /dev/null:  表示Linux的空设备文件
4) 2:      表示标准错误输出
5) &1:     &表示等同于的意思,  2>&1表示2的输出重定向于1
6) &:    表示后台执行,即这条指令执行在后台运行

 

1 >/dev/null:表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。
2>&1:表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设
件。


这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空.
所以可以看出" > /dev/null 2>&1 "常用来避免shell命令或者程序等运行中有内容输出。

 

重定向,例如 echo "Hello" > /root/1.txt

 

  • command > file 2>file
  • command > file 2>&1

 

相同点:上面两个命令都可是实现将执行command后的,标准及错误输出重定向到file文件中。

 

不同点: I/O效率上的差异
command 1>file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file的管道。
command 1>file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。从I/O 效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,最多的时候我们会command 1>file 2>&1 这样的写法, 或 "command >file 2&1"

 

注意:

你要是写成这样:command >/dev/null 2>&1 &, 则第一个 > 的前面可以带有空格;但是如果你写成这样: command 1>/dev/null 2>&1 &, 则第一个 > 的前面最好不带有空格,不然1会被当成command的运行参数。 但第一个 > 的后面可带也可不带空格。   第二个 > 的左右均不能带有任何空格。因此比较保险的方法是所有 > 的前后都不带有空格,准没错。

 

posted @ 2016-07-20 13:38  微信公众号--共鸣圈  阅读(5020)  评论(0编辑  收藏  举报