關於/dev/null,以及如何使用它 今天在看MIT的一個課程時,老師給的程式實例中有一個地方沒弄明白: #!/bin/bash echo "Starting program at $(date)" # Date will be substituted echo "Running program ...
關於/dev/null,以及如何使用它
今天在看MIT的一個課程時,老師給的程式實例中有一個地方沒弄明白:
#!/bin/bash
echo "Starting program at $(date)" # Date will be substituted
echo "Running program $0 with $# arguments with pid $$"
for file in "$@"; do
grep foobar "$file" > /dev/null 2> /dev/null
# When pattern is not found, grep has exit status 1
# We redirect STDOUT and STDERR to a null register since we do not care about them
if [[ $? -ne 0 ]]; then
echo "File $file does not have any foobar, adding one"
echo "# foobar" >> "$file"
fi
done
其中的grep foobar "$file" > /dev/null 2> /dev/null
我著實不能理解,然後進行了相關調查,在What is /dev/null and How to Use It這裡找到了答案。這篇筆記僅作為我個人記錄,防止以後忘記。
Liunx操作系統能自己生成一些虛擬文件以供運行中的程式讀取數據,/dev/null就是這樣一個文件,但它的特殊之處在於它不是用來讀的而是用來寫的。無論往這個文件里寫什麼,最終都會被清理。
我們知道Liunx系統中的數據可以視為stdin,stdout,stderr流。預設情況下,cmd有兩個返回值,分別是命令的output和運行狀態erroe。output會進入stdout流,error會進入stderr流。一旦程式運行成功,error=0;否則都是運行出現異常
什麼是文件描述符(the file descriptor)
在 UNIX 生態系統中,這些是分配給文件的整數值。stdout(文件描述符 = 1)和 stderr(文件描述符 = 2)都有一個特定的文件描述符。使用文件描述符,我們可以把stdout和stderr重定向到其它文件
我們知道>
重定向符,往往我的使用方法是
echo "Hello World" > log.txt
其實這是因為預設情況下,會重定向的是stdout。
如果我們想知道命令運行的狀態,可以像下麵這樣使用
CMD 2> error.txt
那為什麼要使用/dev/null呢?
有一些命令在使用的時候,如果報錯,會有大量的報錯信息,比如grep
作者給了一個很好的例子
$ grep -r hello /sys/
但是使用重定向之後,這些報錯全部都會寫進/dev/null中,丟棄。
特定情況下,我們可能還希望將output與error全部丟棄,如:
$ grep -r hello /sys/ > /dev/null 2>&1
這個命令可以分為2步,先把所有output輸到/dev/null。然後把這個命令的error輸出,並和1(output)合併
這樣一來程式不會有任何輸出,達到了簡潔的目的
總結
/dev/null相當於一個垃圾桶,只不過是以一種寫入文件的方式把垃圾丟掉而已。
最後感謝這篇文章的原始作者給我的幫助