在类Unix操作系统中,设备节点并不一定要对应物理设备。没有这种对应关系的设备被称之为伪设备。操作系统运用了它们实现多种多样的功能,/dev/null和/dev/zero就是这样的设备,类似的还有/dev/urandom、/dev/tty等。
先检查下/dev/null和/dev/zero两个文件的属性:
可以看出这两个文件是字符设备文件。
1. /dev/null
在类Unix系统中,/dev/null(空设备文件或黑洞文件)是一个特殊的设备文件,所有写入其中的数据,都会被丢弃的无影无踪,/dev/null通常被用于丢弃不需要的数据输出,或作为用于输入流的空文件。这些操作通常由重定向完成。
清空文件:
cat /dev/null>/etc/hosts 将从/dev/null读取到的数据写入到/etc/hosts,表示清空hosts文件。 cat/etc/hosts 就没有数据了
将无用的输出流写入到/dev/null丢弃:
[root@oldboy ~]# curl -Iwww.oldboyedu.com|head -1 % Total % Received % Xferd AverageSpeed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 HTTP/1.1 200 OK
执行上述命令时,会凭空多出来的几行无用信息,此时就可以使用将错误信息定向到/dev/null的方式丢弃无用信息。
[root@oldboy ~]# curl -Iwww.oldboyedu.com 2>/dev/null|head -1 HTTP/1.1 200 OK
2./dev/zero
和/dev/null类似,/dev/zero也是一个特殊的字符设备文件,当我们使用或读取它的时候,它会提供无限连续不断的空的数据流(特殊的数据格式流)。
/dev/zero文件的常见应用场景有二:
a./dev/zero文件覆盖其他文件信息。
b.产生指定大小的空文件,例如:交换文件、模拟虚拟文件系统等。
产生指定大小的空文件:
root@oldboy ~]# dd if=/dev/zero of=test.data bs=1M count=2 #<==生成块大小1M,含有2个块的文件。 2+0 records in 2+0 records out 2097152 bytes (2.1 MB) copied,0.00279345 s, 751 MB/s
[root@oldboy ~]# ls -lh test.data
-rw-r--r--. 1 root root 2.0MJul 15 20:20 test.data #<==一共2M大小。
[root@oldboy ~]# file test.data
test.data: data #<==特殊的数据文件格式。
提示:在使用dd命令产生空文件时常用/dev/zero作为字符流的源。
利用/dev/zero文件覆盖其他文件信息:
[root@oldboy ~]# echo oldboy > new.txt #<==生成一个新文件写入oldboy字符串。 [root@oldboy ~]# ddif=/dev/zero of=new.txt bs=1M count=10 #<==用空的字符流覆盖存在的new.txt文件。 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied,0.0475368 s, 221 MB/s
[root@oldboy ~]# cat new.txt #<==数据丢失了。
3./dev/null和/dev/zero的区别
/dev/null : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。
在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole)。空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件。当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。
/dev/zero也是一个伪文件,但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。写入它的输出会丢失不见,/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,像临时交换文件。