対話型シェルから呼び出されたときにのみ色付きのスクリプトを出力します。

対話型シェルから呼び出されたときにのみ色付きのスクリプトを出力します。

カラー出力を生成するbashスクリプトを作成しました。インタラクティブシェルからスクリプトを呼び出すと、色が良好です。ただし、出力が別のスクリプトで処理されたりパイプを通過したりする場合は、色を指定しないでください(私の考えでは)。

この状況は通常どのように処理されますか?カラー出力をオンまたはオフにするオプションを提供する必要がありますか、それともスクリプトがそれを自動的に検出する方法はありますか?自動的に動作することが望ましく、スクリプト呼び出しに応じて色/無色を出力するのに最小限のコードしか必要ありません。

自動検出の1つの問題は、スクリプトが常に非対話型で実行されることです。したがって、親シェルの対話型状態を知る必要があります。

答え1

カラー出力(たとえば、grepおよびls)をサポートするUNIXアプリケーションには通常コマンドラインオプションがあり、自動検出も可能です。

man ls私たちを見てください

--color[=WHEN]
              colorize the output.  WHEN defaults to `always' or can be `never' or `auto'.  More info below

autoしたがって、デフォルトではlsは常に色を使用するため、このオプションに注意してください。

man grep次のようなものを見せてください

 --color[=WHEN], --colour[=WHEN]
              <snipped> WHEN is never, always, or auto.

そのオプションが有効になっている場合auto(アプリケーションのデフォルト値になる可能性がある)、次の答えが見つかります(Gilesが提案)。https://unix.stackexchange.com/a/10065/4635

つまり、出力が端末で行われ、色をサポートし、ユーザーがそれを無効にしていない場合は、色を使用する必要があります。もちろん、ユーザーはこのチェックを使用alwaysまたはneverスキップします。

プログラムが--color=always自動検出をサポートしていても、「私がよりよく知っているとき」色を強制的に使用できるという意味なので、役に立つと思います(対象が端末ではないが色をサポートしていることを知っていると仮定)。 。一部のシステムlsでは、エイリアスがls --color=always

関連情報