2011-08-18 20 views
33

有這一行的shell腳本我已經看到:

grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null 
if [ $? -eq 0 ] 
+1

感謝Wyzard和Chris,很好的答案,但是我可能只能選擇一個答案。 >< –

回答

32

它檢查grep的返回值($?)。在這種情況下,它將它與0(成功)進行比較。

通常當你看到類似的東西(檢查grep的返回值)時,它會檢查是否檢測到特定的字符串。儘管不需要重定向到/dev/null,但使用-q可以完成同樣的事情。

+0

有一個問題,其中是/ dev/null,它是什麼?它是一個文件嗎? –

+4

'/ dev/null'是一種特殊的「黑洞」文件。當你寫信給它時,數據就會被扔掉。這是停止程序將其輸出打印到屏幕的經典方法。 –

+0

要添加到@Chris註釋,'/ dev/null'表示「空設備」。當我想到'/ dev/null'實際上是什麼時,它似乎不是用戶名的一個很好的選擇。 –

25

$?是最近執行的命令的退出狀態;按照慣例,0表示成功,其他任何表示失敗。該行正在測試grep命令是否成功。

grep手冊頁狀態:

退出狀態是0,如果選擇的行被找到,並且如果1未找到。如果發生錯誤,退出狀態爲2(注:POSIX的錯誤處理代碼應該檢查「2」或更大)。

所以在這種情況下,它檢查是否發現任何錯誤行。

+0

+1解釋$? –

2

這是一種極度過度使用的方式來檢查命令的成功/失敗。通常情況下,代碼片段你給將被重構爲:

 
if grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null; then 
    ... 
fi 

(雖然你可以在某些情況下使用「grep的-q」而不是重定向到/ dev/null的,這樣做是不可移植的許多實現grep不支持-q選項,因此如果你使用它,你的腳本就會失敗。)