多くのコマンドが「静かな」オプションを提供するのはなぜですか?


37

標準出力をnullファイルにリダイレクトすることで同じことを簡単に達成できるのに、多くのコマンドがオプションを提供し-qたり--quiet、出力を抑制したりするのはなぜですか?


3
私はそれを主に便利なフラグと考えています。
ジャニス

7
すべてのコマンドがすべての出力-qを抑制するために使用するわけではありません。たとえば、Dockerには画像を一覧表示するコマンドがあります。多数の情報を含むフォーマットされたテーブルを表示し、画像IDのプレーンリストを出力します(他のコマンドへのパイプに便利です)。docker imagesdocker images -q
new123456

回答:


71
  • シェルで簡単にリダイレクトできますが、シェルコマンドラインを使用せずに別の言語でコマンドを実行する場合のように、簡単ではない他のコンテキストがあります。シェルでも:

    find . -type f -exec grep -q foo {} \; -printf '%s\n'

    を含むすべてのファイルのサイズを印刷しますfoo。にリダイレクトすると/dev/null、両方findgrep出力が失われます。頼る必要があります-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(つまり、追加のシェルを作成します)。

  • grep -q foo 入力するよりも短い grep foo > /dev/null
  • へのリダイレクト/dev/nullは、出力がまだ書き込まれてから破棄されることを意味します。これは、書き込みを行わない場合よりも効率が低くなります(割り当てずに、書き込む出力を準備します)
  • それにより、さらなる最適化が可能になります。以下の場合grepで以来、例えば、-qgrepそれは最初に一致を見つけると、出力が必要とされていない知っている、それはすぐに終了します。でgrep > /dev/null、まだすべての一致を見つけようとします。
  • 静かは必ずしも意味しないサイレント。一部のコマンドでは、冗長性減らします(の反対-v|--verbose)。たとえばmplayer--quietとがあり--really-quietます。一部のコマンドでは、-qqq詳細度を3倍下げることができます。

移植性が懸念される場合は、grepマンページでオプション-q、およびの両方を-s回避することが推奨されていることは注目に値します。grepの早期終了は重要な最適化ですが、そのようなオプションを持つすべてのプログラムがそれを行えるわけではありません。curl -sデータ全体を処理します(ただし、3番目のポイントが適用されるため、処理時間が節約されます)。
ジャニス

6
@Janis、それは非常に古いシステムへの移植性です。両方-q-sはPOSIXで指定されています。古いシステムを検討する場合sh -c '...' sh {} \;、(以前のkshベースshのsでは)私も動作しません。
ステファンシャゼル

マニュアルページには、USGスタイルのgrepにも-qがありませんでしたが、その-sオプションはGNU grepのように動作しました。-行動の違いが問題になると思いました。その関連性について判断することはできません。
ジャニス

スクリプト内のコマンドのリターンコードのみを考慮する場合、-qおよび--quietオプションを頻繁に使用します。上記の理由は、さらに良い例です。
マークスチュワート

@StéphaneChazelas:多くのシステムが(その一部で)まだ古くなっていることに驚かれることでしょう...(実際、それほど多くはありません^^しかし、まだいくつかあります)
オリビエデュラック

3

画面へのメモが必要だと感じた場合でも、コマンドを出力できますが、通常は何も出力しません。すべてをnullにリダイレクトすると、出力が表示される可能性がなくなります。


まあ、静かは応答が期待されないことを意味します。とにかく出力が表示された場合、それは予期しないことです。(とにかく(端末接続プロセスで)印刷するのに「本当に本当に」重要な何かがある場合、tty / ptyデバイスをプロセスで直接使用できます。その例としては、パスワードのインタラクティブな問い合わせなどがあります。 )
ジャニス

2

おそらくコマンドに依存しますが、-qへの出力も無効にしますstderr。これにより、ノイズを回避するためにstderrを簡単に複製することを許可しないシェルをstdout(私はあなたを見ていますcshtcsh)にできます。

一部のプログラムには、ステータスメッセージで煩雑になりたくない他の意味のある出力がある場合に、「静かな」オプションが用意されています。-qまたは同等の、からの純粋なデータ・ストリームを許可する、すべてのプログラムステータス出力を沈黙言う、でしょうtargzip


0

上記のすべての良い反応とポイントに加えて。すべてのフラグに反対のオプションを提供することをお勧めします。したがって、冗長性に-vがある場合は、非冗長性、完全または無音に-qを使用する必要があります。(これは議論のポイントではありませんが...)すべての短いオプションの長いオプションである-qおよび--quiteと同じです。

私たちのビジネスのほぼすべてにおいて、解決策や同じ結果を得るには多くの方法があります。-qを持つことはそれらの1つです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.