2011-08-18 17 views
33

この行は私が見てきたシェルスクリプトである:

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

おかげさまで、WyzardとChrisに感謝します。 >< –

答えて

32

それはgrepの戻り値($?)をチェックしています。この場合は、0(成功)と比較しています。

通常、このようなもの(grepの戻り値をチェックする)が表示されたら、特定の文字列が検出されたかどうかを確認します。 /dev/nullへのリダイレクトは必要ありませんが、同じことは-qを使用して達成できます。

+0

1つの質問、/ dev/nullはどこですか?それはファイルですか? –

+4

'/ dev/null'は特別な"ブラックホール "ファイルの一種です。あなたがそれに書き込むと、データは破棄されます。これは、プログラムが出力を画面に表示するのを止める古典的な方法です。 –

+0

@Chrisのコメントに追加するには、 '/ dev/null'は" null device "を意味します。 '/ dev/null'が実際に何であるかを考えてみると、それはユーザー名のための素晴らしい選択肢のようには思えません。 –

25

$?は、直前に実行されたコマンドの終了ステータスです。規約では0は成功を意味し、それ以外の場合は失敗を意味します。その行はgrepコマンドが成功したかどうかをテストしています。

grepマンページの状態が:

終了ステータスは、選択した行が見つかった場合は0であり、そして1見つからない場合。

この場合、ERROR行が見つかったかどうかをチェックしています。エラーが発生した場合は、終了ステータスは2です(注:POSIXエラー処理コードでは2以上をチェックする必要があります)。

+0

+1を説明するために+1? –

2

コマンドの成功/失敗をチェックするのは非常に使いすぎです。あなたの代わりに/ dev/nullにリダイレクトのいくつかの例では「grepの-q」を使用することができますが、そうすることが、ポータブルではありません(

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

の多くの実装:。一般的に、コードはあなたのようにリファクタリングされるだろう与えるスニペットgrepは-qオプションをサポートしていないため、スクリプトを使用するとスクリプトが失敗する可能性があります)。

関連する問題