要点分解
为了能理解commond > /dev/null 2>&1
命令的具体意思,我们将分三个要点进行介绍。
part 1 伪设备
在类Unix系统上的设备节点不一定必须与物理设备相对应。缺少此对应关系的节点构成伪设备组。它们提供操作系统处理的各种功能。一些最常用(基于字符的)伪设备包括:
/dev/null
- 接受并丢弃所有输入; 不产生输出(总是在读取时返回文件结束指示)/dev/zero
- 接受并丢弃所有输入; 产生连续的NUL(零值)字节流/dev/full
- 读取时产生连续的NUL(零值)字节流,并在写入时返回“磁盘已满”消息/dev/random
和/dev/urandom
-它们产生的一个可变长度的数据流的伪随机数。
part 2 文件描述符
在类unix系统中,当系统启动时就已经有三个标准文件流以及三个文件描述符被预先占用了,其对应关系如下。
名称 | 文件描述符 | 缩写 | 设备 |
---|---|---|---|
标准输入 | 0 | STDIN | 键盘 |
标准输出 | 1 | STDOUT | 屏幕 |
标准错误输出 | 2 | STDERR | 屏幕 |
当我们执行某个命令时,如果该命令执行正确并且有输出,则该命令的输出是在标准输出设备。如果该命令执行失败,类unix系统则会给出提示,该提示在标准错误设备输出。
例如:
[root@li1544-92 ~]# pwd
/root
[root@li1544-92 ~]# pwddd
-bash: pwddd: command not found
part 3 重定向
重定向是把输出定向到文件或者标准流,重定向符有两个:
>
以覆盖的方式重定向输出到文件>>
以追加的方式重定向输出到文件
将pwd的结果输出到pwd.log
[root@li1544-92 ~]# pwd > pwd.log
查看结果
[root@li1544-92 ~]# cat pwd.log
/root
追加的方式重定向
[root@li1544-92 ~]# pwd >> pwd.log
[root@li1544-92 ~]# cat pwd.log
/root
/root
在之前也说过,若命令执行错误,标准错误输出也给出打印,若想要将标准错误输出不在屏幕输出,则需要使用重定向技术,将标准错误输出重定向到标准输出 2>&1
:
&是用来告诉系统1这里指的是标准输出,而不是文件。
下面例子展示了如何将错误信息也重定向到文件。
将正确输出和错误输出都重定向到pwd.log日志中。
[root@li1544-92 ~]# pdwd > pwd.log 2>&1
[root@li1544-92 ~]# cat pwd.log
-bash: pdwd: command not found
command > /dev/null 2>&1
通过以上三部分介绍该语句的函数就是将标准输出和标准错误输出重定向到伪设备/dev/null
,它的作用就是执行某个命令将不会有任何日志输出。
例如:
第二个&是后台运行,这样arping命令就不会干扰我们的继续工作。
[root@li1544-92 ~]# arping 192.168.1.1 > /dev/null 2>&1 &
[2] 20212
非法命令,屏幕没有提示信息
[root@li1544-92 ~]# arpingaaa 192.168.1.1 > /dev/null 2>&1 &
[2] 20212
查看后台影响任务状态信息
[root@li1544-92 ~]# jobs -l
[1]- 20229 Running arping 192.168.1.1 > /dev/null 2>&1 &
[2]+ 20232 Exit 127 arpingaaa 192.168.1.1 > /dev/null 2>&1
以上命令不管执行正确还是非法命令 屏幕都将不会有任何信息提示,也就是说它们将没有任务日志输出。
参考资料:
https://en.wikipedia.org/wiki/Device_file#Pseudo-devices
https://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean