/dev/null 、/dev/zero、/dev/random、/dev/urandom
Linux中的虛擬設備/dev/null、/dev/zero、/dev/random和/dev/urandom
/dev/null
利用/dev/null來清除不必要的輸出
把/dev/null看作"黑洞"。它非常等價于一個只寫文件,所有寫入它的內容都會永遠丟失。而嘗試從它那兒讀取內容則什么也讀不到。
(1)禁止標準輸出:
cat $filename >/dev/null
# 文件內容丟失,而不會輸出到標準輸出。
(2)禁止標準錯誤:
rm $badname 2>/dev/null(2表示含義后面解釋)
#這樣錯誤信息[標準錯誤]就被丟到太平洋去了。
>/dev/null 2>&1 是什么意思
在一些Shell腳本中,經常會看到 >/dev/null 2>&1這樣的寫法。
其實這個很好理解。我們分兩部分解釋。
大家知 “>”(右尖括號) 在unix/linux shell 中表示 輸入到 的意思,就是把”>”左邊的內容輸入到”>”右邊。
比如:echo text>1.txt 就把“text”這個文本輸入到1.txt這個文件中。
那么 “/dev/null” 又是個什么東東呢?它代表一個空設備,即不存在的設備。也就是說,拋棄”>”左邊的內容,不進行輸出。
2>&1這個其實是三個部分組成的:2, >&, 1 。我們先來搞清楚這里的2和1是什么意思。在/usr/include/unistd.h中,你可以找到如下代碼。
#define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2這是三種不同的流。
0-標準輸入流(stdin)
1-標準輸出流(stdout)
2-標準錯誤流(stderr)
而 &> 則表示把符號左邊的內容以符號右邊的形式輸出。
2&>1 就是把,把stderr做為stdout輸出。
現在我們結合這兩個部分來看。2&>1定義了把stderr做為標準的stdout流輸出,然后stdout的內容全部寫入/dev/null,也就是說被舍棄掉。
結論就是,無論執行的是什么命令,哪怕運行中出現了error都不會有回顯。
1>/dev/null
有時候,我們可能不想看標準輸出的內容,相反,想要看標準錯誤的內容,那么我們就可以將標準輸出重定向到 /dev/null 。
$ ping baidu.com 1>/dev/null
上面的截圖顯示,若沒有重定向輸出,當數據包可以到達目標主機時,ping 指令會顯示它的正常輸出。而第一個命令,當網絡是連通的時候屏幕什么也沒顯示,但是一旦它與目標機器斷開連接,屏幕就只顯示了錯誤信息。
當然了,你也可以將標準輸出與標準錯誤輸出重定向到兩個不同的文件。
/dev/zero
在類UNIX 操作系統中, /dev/zero 是一個特殊的文件,當你讀它的時候,它會提供無限的空字符(NULL, ASCII NUL, 0x00)。
其中的一個典型用法是用它提供的字符流來覆蓋信息,另一個常見用法是產生一個特定大小的空白文件。BSD就是通過mmap把/dev/zero映射到虛地址空間實現共享內存的。可以使用mmap將/dev/zero映射到一個虛擬的內存空間,這個操作的效果等同于使用一段匿名的內存(沒有和任何文件相關)。
/dev/random和/dev/urandom
隨機數設備,提供不間斷的隨機字節流。二者的區別是/dev/random產生隨機數據依賴系統中斷,當系統中斷不足時,/dev/random設備會“掛起”,因而產生數據速度較慢,但隨機性好;/dev/urandom不依賴系統中斷,數據產生速度快,但隨機性較低。
讀取這兩個文件的輸出如下:
讀取/dev/random文件在輸出了兩行之后就停住了(系統中斷不足),而/dev/urandom產生數據速度很快,沒有任何停頓。
下面這個例子,利用/dev/urandom設備產生一個128位的隨機字符串:
$ str=$(cat /dev/urandom | od -x | tr -d ' ' | head -n 1) $ echo ${str:7} 17539187d2e8b8e26d49bec90465c14d總結
以上是生活随笔為你收集整理的/dev/null 、/dev/zero、/dev/random、/dev/urandom的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去掉Android中的耳机音量调节到最大
- 下一篇: 数据结构-约瑟夫环