你們好,我是良許。ubuntu
你們知道,在 Linux 下,一切皆文件,對於設備文件也是如此。咱們在工做的過程當中,常常會看到 /dev/null
這個玩意,那它究竟是什麼呢?服務器
專業地講,/dev/null
是一個虛擬設備文件。而對程序而言,這些虛擬設備文件則會被當成真實的文件對待。程序能夠向這種數據源請求數據,所獲得的數據將由操做系統提供。可是,這些數據並非從磁盤上讀取到的,而是由操做系統動態生成的。虛擬設備文件的一個典型例子就是 /dev/zero
。markdown
然而,當你想向 /dev/null
寫入數據時,不管你向 /dev/null
中寫入什麼數據,最終都會被丟棄,就像被丟入黑洞同樣。網絡
既然如此,那麼 /dev/null
到底有什麼用?要理解這個問題,你首先必需要對 Linux 系統或者 Unix 以及類 Unix 系統的標準輸出以及標準錯誤輸出有基本的瞭解。測試
一個命令行程序能夠生成兩種類型的輸出:標準輸出與標準錯誤輸出。標準輸出會被記錄到標準輸出文件 stdout ,而標準錯誤輸出會被記錄到標準錯誤輸出文件 stderr 。操作系統
默認狀況下,標準輸出文件與標準錯誤輸出文件都與你的終端窗口相關聯(或者控制檯)。這就意味着任何被輸送到標準輸出文件或標準錯誤輸出文件的信息都會被顯示在你的屏幕上。命令行
可是,經過 Shell 中的重定向,你就能夠改變這個行爲。好比,你能夠將標準輸出重定向到一個文件中。這樣,標準輸出信息就不會顯示在屏幕上,它將會被保存到那個文件中以便你之後查閱,或者你也能夠將標準輸出信息重定向到另外一個物理設備上,好比一個數字 LED 或者 LCD 顯示器。code
一些經常使用的重定向方式有以下:blog
2>
你能夠重定向標準錯誤輸出信息。例如:2>/dev/null
或者 2>/home/user/error.log
。1>
你能夠重定向標準輸出信息。&>
你能夠同時重定向標準錯誤輸出信息與標準輸出信息。因爲存在兩種類型的輸出:標準輸出與標準錯誤輸出,因此 /dev/null
的第一個用途就是過濾掉其中一種類型的輸出。經過下面實際的例子能夠更容易地理解以上這個用途。字符串
假如你想經過找 /sys
文件夾下文件名帶 power
字符串的文件以此來找到關於電源設置的文件,你能夠這麼寫命令:
$ grep -r power /sys/
因爲 /sys
文件夾下存在不少非 root 用戶沒法訪問的文件,這樣就會形成不少 Permission denied
錯誤,並被輸出到屏幕上。
這些錯誤信息會使得屏幕變得雜亂不堪,一些重要的信息都會被沖刷不見了。而因爲 Permission denied
錯誤信息是屬於標準錯誤輸出的一部分,因此你能夠將它們重定向到 /dev/null
。
$ grep -r power /sys/ 2>/dev/null
這樣,顯示出來的信息就乾淨清爽不少了。
有時候,咱們可能不想看標準輸出的內容,相反,想要看標準錯誤的內容,那麼咱們就能夠將標準輸出重定向到 /dev/null
。
$ ping baidu.com 1>/dev/null
上面的截圖顯示,若沒有重定向輸出,當數據包能夠到達目標主機時,ping 指令會顯示它的正常輸出。而第一個命令,當網絡是連通的時候屏幕什麼也沒顯示,可是一旦它與目標機器斷開鏈接,屏幕就只顯示了錯誤信息。
固然了,你也能夠將標準輸出與標準錯誤輸出重定向到兩個不一樣的文件。
$ ping baidu.com 1>/dev/null 2>error.log
在這個例子中,標準輸出信息就不會被顯示,而錯誤信息將會被保存到名爲 error.log
的文件中。
有時候,咱們可能都不想看任何輸出,那麼有兩種方法能夠作到這點。
$ grep -r power /sys/ >/dev/null 2>&1
字符串 >/dev/null
表明 將標準輸出重定向到 /dev/null 中
,而後第二部分,2>&1
,表明將標準錯誤重定向到標準輸出文件中。這裏你必須將標準輸出文件寫成 &1
,而不是簡單地寫成 1
。寫成 2>1
這樣只會將標準輸出重定向到一個名爲 1
的文件中。
這裏要着重注意的一點是,順序也是很重要的。若是你將重定向的參數調換位置成如下這樣:
$ grep -r power /sys/ 2>&1 >/dev/null
它就不是按你預期的那樣執行了。那是由於一旦 2>&1
先被解釋器解釋了,標準錯誤輸出就會被重定向到默認的標準輸出文件 stdout
而且顯示在屏幕上。而接下來,當標準輸出被重定向到 /dev/null
時,標準輸出信息就會被清除。最終的結果就是你將會看到錯誤信息顯示在屏幕上。若是你忘記了正確的順序,還有一個更簡單:
$ grep -r power /sys/ &>/dev/null
在這個例子中,&>/dev/null
就等效於 重定向標準輸出與標準錯誤輸出到 /dev/null
。
假如你想知道你的磁盤讀取序列數據的速度到底有多快,你可使用 dd
命令來作測試。可是 dd
指令要麼就是輸出到標準輸出文件,要麼就是指定輸出到一個文件中。爲了排除寫入數據對結果的影響,咱們使用參數 of=/dev/null
,這樣就可使 dd
輸出寫入到這個虛擬文件中,而不是真正的磁盤裏。這裏你甚至都不須要用 Shell 的重定向就能夠作到這點。
對於下面這條命令,參數 if=
指定用於輸入的文件名;參數 of=
指定用於輸出的文件名,即指定將輸出寫入到哪裏。
如下這樣的測試並非十分精確,但也足夠說明問題了。
$ dd if=debian-disk.qcow2 of=/dev/null status=progress bs=1M iflag=direct
以上是一個實用場景。下面再介紹一個場景。
在某些狀況下,你可能會想知道你從某一個服務器上下載東西的速度有多快。可是你又不想向磁盤寫入沒必要要的東西,那麼這個時候,你就能夠把內容寫入到 /dev/null
裏。
$ wget -O /dev/null http://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso
本文介紹幾種 /dev/null
文件的幾種實用用法,但願對你的工做有幫助。你還知道這個特殊設備文件的其它有趣的用途嗎?留言告訴我唄!
公衆號:良許Linux