標準出力をnullファイルにリダイレクトすることで同じことを簡単に達成できるのに、多くのコマンドがオプションを提供し-qたり--quiet、出力を抑制したりするのはなぜですか?
-qを抑制するために使用するわけではありません。たとえば、Dockerには画像を一覧表示するコマンドがあります。多数の情報を含むフォーマットされたテーブルを表示し、画像IDのプレーンリストを出力します(他のコマンドへのパイプに便利です)。docker imagesdocker images -q
標準出力をnullファイルにリダイレクトすることで同じことを簡単に達成できるのに、多くのコマンドがオプションを提供し-qたり--quiet、出力を抑制したりするのはなぜですか?
-qを抑制するために使用するわけではありません。たとえば、Dockerには画像を一覧表示するコマンドがあります。多数の情報を含むフォーマットされたテーブルを表示し、画像IDのプレーンリストを出力します(他のコマンドへのパイプに便利です)。docker imagesdocker images -q
回答:
シェルで簡単にリダイレクトできますが、シェルコマンドラインを使用せずに別の言語でコマンドを実行する場合のように、簡単ではない他のコンテキストがあります。シェルでも:
find . -type f -exec grep -q foo {} \; -printf '%s\n'
を含むすべてのファイルのサイズを印刷しますfoo。にリダイレクトすると/dev/null、両方findとgrep出力が失われます。頼る必要があります-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(つまり、追加のシェルを作成します)。
grep -q foo 入力するよりも短い grep foo > /dev/null/dev/nullは、出力がまだ書き込まれてから破棄されることを意味します。これは、書き込みを行わない場合よりも効率が低くなります(割り当てずに、書き込む出力を準備します)grepで以来、例えば、-q、grepそれは最初に一致を見つけると、出力が必要とされていない知っている、それはすぐに終了します。でgrep > /dev/null、まだすべての一致を見つけようとします。-v|--verbose)。たとえばmplayer、--quietとがあり--really-quietます。一部のコマンドでは、-qqq詳細度を3倍下げることができます。grepマンページでオプション-q、およびの両方を-s回避することが推奨されていることは注目に値します。grepの早期終了は重要な最適化ですが、そのようなオプションを持つすべてのプログラムがそれを行えるわけではありません。curl -sデータ全体を処理します(ただし、3番目のポイントが適用されるため、処理時間が節約されます)。
-qと-sはPOSIXで指定されています。古いシステムを検討する場合sh -c '...' sh {} \;、(以前のkshベースshのsでは)私も動作しません。