grep
コマンドがあります。ファイルからキーワードを検索していますが、一致を表示したくありません。 grep
の終了ステータスを知りたいだけです。
POSIX準拠バージョンのgrep
にはスイッチ-q
静寂の場合:
-q
Quiet. Nothing shall be written to the standard output, regardless
of matching lines. Exit with zero status if an input line is selected.
GNU grep(およびその他の可能性のあるもの)では、長いオプションの同義語も使用できます。
-q, --quiet, --silent suppress all normal output
文字列が存在します:
$ echo "here" | grep -q "here"
$ echo $?
0
文字列は存在しません:
$ echo "here" | grep -q "not here"
$ echo $?
1
grep
の出力を/dev/null
にリダイレクトするだけです。
grep sample test.txt > /dev/null
echo $?
grep -q <pattern>
と、終了する最後のプロセスの終了コードの即時チェック($?
)を組み合わせるだけです。
これを使用して、たとえば次のようなコマンドを作成できます。
uname -a | grep -qi 'linux' ; case "$?" in "0") echo "match" ;; "1") echo "no match" ;; *) echo "error" ;; esac
オプションで、次のようにSTDERR
からの出力を抑制できます。
grep -qi 'root' /etc/shadow &> /dev/null ; case "$?" in "0") echo "match" ;; "1") echo "no match" ;; *) echo "error: $?" ;; esac
これにより、case
ステートメントからerror: 2
が出力されます(/etc/shadow
を読み取る権限がないか、ファイルが存在しない場合)。ただし、grep
からのエラーメッセージ/dev/null
にリダイレクトされるため、表示されません。
anyの出力を表示したくない場合は、stderrとstdoutの両方を/ dev/nullにリダイレクトする必要があります。他の答えは良いですが、存在しないか読めない(例:間違った許可)ファイルから読み込もうとするようなエラーを抑制しません。追加&> /dev/null
(bashや他のいくつかのシェルで機能しますが、すべてではありません。>/dev/null 2>&1
の方が移植性が高い可能性があるため、出力は表示されません。
$ ls thisfiledoesnotexist
ls: cannot access thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist
grep: thisfiledoesnotexist: No such file or directory
$ grep -q foo thisfiledoesnotexist
grep: thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist >/dev/null
grep: thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist &>/dev/null
$ echo $?
2
$ touch nopermissions
$ chmod 000 nopermissions
$ grep -q foo nopermissions
grep: nopermissions: Permission denied
$ grep foo nopermissions > /dev/null
grep: nopermissions: Permission denied
$ grep foo nopermissions &> /dev/null
$ echo $?
2
$
ターゲットファイルが存在し、ファイルであることをすでに確認していて、それを読み取る権限がある場合、これはそれほど重要ではありませんが、もう少し不注意で再帰的にgrepを実行したり、ワイルドカードを使用したりしている場合は、 stderrに出力が表示される可能性が高くなります。