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


8

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

回答:


12

予想される行動

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

通常、--color=autoあなたが欲しいものです。たとえば、grepを使用してURLを照合し、それをWgetにパイプすると\e[1;31mhttp://...、実際のURLの代わりにWgetが表示されます(そして、URL が表示されなくなります)。

次のコマンドを実行すると、出力に色が付きます。

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")

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

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

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

isatty(STDOUT_FILENO) && should_colorize()

はtrueで、should_colorize()POSIXとWin32では定義が異なります。

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


端末に書き込むかどうかはどのようにしてわかりますか?
トロルツェン

1
そのためのC関数があります。あなたは、ヘッダーファイルをインクルードする場合はsdgstd.histty(stdout)返す0出力をファイルにリダイレクトされている場合。
Dennis

窓のポートを備えたI実験greplessGnuWinプロジェクトから(gnuwin32.sourceforge.net)。ユーティリティcmd.exeで改善されていansiconます。less --color=auto期待どおりに機能します。リダイレクトが適用されない場合は色を使用し、出力がリダイレクトされる場合は使用しません。ただしgrep --color=auto、どちらの場合もエスケープシーケンスは出力されません。
Trolzen

なぜこれが起こるのか理解できません。これらのユーティリティは、UNIXバージョンとWindowsバージョンの両方で同じコードを持っていると思いましたが、それらはかなり古いものです。したがって、それらは同じように動作するはずです。
Trolzen

それはGnuWin32のgrepのバグです。Ubuntuでは、私の回答で詳しく説明したように動作します。どちらも同じソースコードから派生していますが、別のプラットフォームでコンパイルする場合は、常に微調整が必​​要です。また、GnuWin32の現在のバージョンのgrepは2.5.4であることに注意してください。Ubuntuの最新バージョンは2.12です。
Dennis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.