grepの出力を/ dev / nullにリダイレクトする意味は何ですか?


24

次の行を検討してください。

${libdir}/bin/licenseTool check "${SERIAL}" "${VERSION}" "${PRODUCT}" ${libdir} | grep '^200' >/dev/null

結果ならば出力内のパターンを探しているのポイント何捨てられますか?

そして、そのような行がbashスクリプトの最後のものとして表示される場合、その終了値はスクリプトの呼び出し元に返されますか、それとも無視されますか?(これは副作用のためだけに行われると推測できるのか、何らかの形で呼び出し元に何かを返すのかどうか推測しています。)

回答:


29

あなたの疑いは正しい。スクリプトの最後のコマンドの終了ステータスが呼び出し環境に渡されます。したがって、答えは、このスクリプトはgrep、データ内の一部に一致した場合は終了ステータス0を返し、一致がなかった場合はステータス1を、エラーが発生した場合は終了ステータス2 を返すということです。


27

grep破棄されるping出力のポイントは、ライターがの戻りステータスのみを必要とすることですgrep。彼/彼女は、パターンが一致したかどうかを知りたいだけです。あなたの場合、最後のgrepコマンドは、前のコマンドの出力にで始まる行が含まれているかどうかをチェックし200ます。

最新のPOSIXシステムでは、次の場所にリダイレクトせずに、grep -qを使用してすべてを実行できます/dev/null

... | grep -q '^200'

使用grep -qには小さな副作用があることに注意してください。StéphaneChazelasがコメントで指摘してくれたことに感謝します。grep -q最初の一致が見つかるとすぐに終了し、終了licenseTool後も何かを書き込む場合grep、SIGPIPEを受け取ります。


2
そして、grep -qCPUの使用少ない
Skaperen

5
これらが進むにつれて、grep -q比較的最近追加されました。> /dev/null氷河期(つまり1995年)に戻ったのはそれだけだったので、多くのスクリプトが代わりに使用しています。
-zwol

3
最初の文には動詞がありませんか?
-AL

GNUマンページの「grep -q」と「grep> / dev / null」の別の不一致:「ただし、-qまたは--quietまたは--silentが使用され、行が選択されている場合、終了ステータスはエラーが発生した場合でも0。」
マーク

ドキュメントが正しい場合、「エラーが発生した場合でも終了ステータスは0です」... -qオプションは適切ではないと思います...終了ステータスをチェックすることでエラーについて知る必要があるためです。
トレバーボイドスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.