請解釋Linux中/dev/null和/dev/zero兩個檔案的作用和差別。
在類Unix作業系統中,裝置節點并不一定要對應實體裝置。沒有這種對應關系的裝置被稱之為僞裝置。作業系統運用了它們實作多種多樣的功能,/dev/null和/dev/zero就是這樣的裝置,類似的還有/dev/urandom、/dev/tty等。
先檢查下/dev/null和/dev/zero兩個檔案的屬性:
[root@oldboy ~]# ls -l /dev/null /dev/zero
crw-rw-rw-. 1 root root 1, 3Jul 15 00:11 /dev/null
crw-rw-rw-. 1 root root 1, 5Jul 15 00:11 /dev/zero
提示:從檔案屬性可以看出這兩個檔案都是字元裝置檔案。
1)/dev/null介紹
大家都知道宇宙中“太陽黑洞”吧,所有的天體(含地球)一旦進入了太陽黑洞都會消失的無影無蹤。這裡的/dev/null就是Linux系統中的"黑洞"。
在類Unix系統中,/dev/null(空裝置檔案或黑洞檔案)是一個特殊的裝置檔案,所有寫入其中的資料,都會被丢棄的無影無蹤,/dev/null通常被用于丢棄不需要的資料輸出,或作為用于輸入流的空檔案。這些操作通常由重定向完成。
2)/dev/null實踐
範例1-1:清空檔案。
[root@oldboy ~]# cp /etc/hosts{,.ori} #<==備份。
[root@oldboy ~]# cat /dev/null>/etc/hosts #<==将讀取黑洞裝置寫入到/etc/hosts,表示清空hosts檔案。
[root@oldboy ~]# cat /etc/hosts #<==果然沒了。使用上述備份恢複回來。
範例1-2:将無用的輸出流寫入到黑洞丢棄。
當取一個位址響應頭的第一行時,加上管道就會出現下面的特殊結果:
[root@oldboy ~]# curl -I www.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
執行上述指令時,會憑空多出來的幾行無用資訊,此時就可以使用将錯誤資訊定向到黑洞(2>/dev/null)的方式丢棄無用資訊。
[root@oldboy ~]# curl -I www.oldboyedu.com 2>/dev/null|head -1 #<==将錯誤資訊定向到黑洞。
當然了curl指令也提供了實作參數,這裡暫且不多表。
[root@oldboy ~]# curl -I -s www.oldboyedu.com|head-1
範例1-3:将定時任務腳本結尾加上>/dev/null 2>&1
在書寫定時任務總,規範的寫法就是将所有定時任務腳本結尾加上>/dev/null 2>&1,讓所有的輸出流(包括錯誤的和正确的)都定向到空裝置丢棄。
[root@oldboy ~]# crontab -l
#time sync by oldboy at2010-2-1
*/5 * * * * /usr/sbin/ntpdatetime.windows.com >/dev/null 2>&1
#bak all db
00 01 * * * /bin/sh/server/scripts/mysqlbak.sh >/dev/null 2>&1
1) /dev/zero介紹
和/dev/null類似,/dev/zero也是一個特殊的字元裝置檔案,當我們使用或讀取它的時候,它會提供無限連續不斷的空的資料流(特殊的資料格式流)。
/dev/zero檔案的常見應用場景有二:
a./dev/zero檔案覆寫其他檔案資訊。
b.産生指定大小的空檔案,例如:交換檔案、模拟虛拟檔案系統等。
2)/dev/zero實踐
範例1-5:産生指定大小的空檔案。
[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 -lhtest.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作為字元流的源。
範例1-4:利用/dev/zero檔案覆寫其他檔案資訊
[root@oldboy ~]# echo oldboy>new.txt #<==生成一個新檔案寫入oldboy字元串。
[root@oldboy ~]# dd if=/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 #<==資料丢失了。
本文轉自liujing0751CTO部落格,原文連結:http://blog.51cto.com/13281352/1981524 ,如需轉載請自行聯系原作者