web-dev-qa-db-ja.com

grepスイッチ--color = autoは何をしますか?

--colorスイッチのオプションとしてのautoは、grepにどのような影響を及ぼしますか? grepは、一致する文字列に色を付けることをいつ決定し、いつ決定しませんか?

8
Trolzen

予想される行動

_--color=auto_を使用すると、出力が端末に直接書き込まれ、その端末が色付きの出力を表示できる場合にのみ、grepは一致する文字列を強調表示します。

通常、_--color=auto_が必要です。たとえば、grepを使用してURLを照合し、それをWgetにパイプすると、Wgetは実際のURLの代わりに_\e[1;31mhttp://..._を表示します(そしてそれをチョークします)。

次のコマンドは、色付きの出力になります。

_echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat
_

ただし、このコマンドは次のことを行うべきではありません。

_echo Super User | grep --color=auto Super | cat
_

この動作に矛盾がある場合は、バグと見なす必要があります。

ソースコード

_--color=auto_を使用すると、最新の Grep for Windows バージョン(2.5.4)–およびそれが基づいている元の2.5.4 –条件がある場合にのみ、出力に色を付けます。

_isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")
_

trueです。つまり、出力が端末に書き込まれている場合にのみ、 環境変数TERM が定義され、端末は ダム ではありません。

TERMは通常定義されていないため、これではWindowsで目的の動作が生成されません。この問題の簡単な解決策は、コントロールパネルで_TERM=windows_を設定することです。

最新バージョンの grep (2.14)は、条件がある場合にのみ出力に色を付けることでこの問題を修正します

_isatty(STDOUT_FILENO) && should_colorize()
_

trueの場合、should_colorize()はPOSIXとWin32で異なる方法で定義されます。

前者の場合、条件は2.5.4の条件と同等です。後者の場合、環境変数TERMを設定する必要はありません(dumbにすることはできません)。

12
Dennis