使用腳本編譯文件時,會產生一些編譯的log或txt文件,在重新編譯時會導致無法進行第二次編譯,故在寫編譯腳本時,需要在編譯前進行編譯log文件的清除操作。
一般使用如下操作:
if [ -e *.log ]; then
rm *.log
fi
此時如果文件不存在,則不報錯誤。但如果有多個.log文件存在,則報錯。這顯然不滿足要求的。在上述if[ -e *.log ]操作中,因爲-e 或者 -f 都只能接受一個參數,用了通配符後會有多個文件存在的可能就導致多個參數出現的可能,所以報錯。
採用以下操作就會解決產生多個*.log清除時報錯的問題。
files=$(ls *.log 2> /dev/null | wc -l)
if [ "$files" != "0" ] ;then
rm *.log
fi
對於以上的操作解釋:
ls *.log 查找所有的log文件;
2> 表示重定向操作錯誤提示信息(只有這兩個字符並不能刪除錯誤輸出);
-
0 —— stdin(標準輸入)
-
1 —— stdout (標準輸出)
-
2 —— stderr (標準錯誤)
重定向操作符號有兩個>和>>。儘管這兩個操作符都可以將重定向到文件,但是前者會先清空文件,再寫入內容;後者會將內容追加到現有文件的尾部。
/dev/null 是一個特殊的設備文件,這個文件接收到的任何數據都會被丟棄。因此,null這個設備通常也被成爲位桶(bit bucket)或黑洞。
(借用網絡圖)
wc 指令我們可以計算文件的Byte數、字數、或是列數,若不指定文件名稱、或是所給予的文件名爲"-",則wc指令會從標準輸入設備讀取數據。
參數:
-c或--bytes或--chars 只顯示Bytes數。
-l或--lines 只顯示行數。
-w或--words 只顯示字數。
--help 在線幫助。
--version 顯示版本信息
命令:file=$(ls *.log 2> /dev/null | wc -l)
ls命令如果出現了錯誤提示,就會被重定向到/dev/null垃圾桶去了。所以,屏幕上不會打印任何輸出關於錯誤的提示字符。在這個命令的操作中,file 獲得文件stdout標準輸出,也就是文件述符1的屏幕輸出結果"*.log"。如果,這個123.txt文件不存在,file就肯定什麼都拿不到,因爲錯誤提示被/dev/null 吃了(劃掉),被重定向丟棄了屏幕也不顯示錯誤提示。所以,file 就是個什麼都沒有的空變量。
通過上述的操作,就可以刪除編譯產生的多個*.log文件。