7

出力で一致するテキストを強調表示するためにエスケープ コードを使用するスクリプトがあります。less出力が にパイプされ、エスケープ コードが出力される場合を除いて、すべて問題ありません。

例えば

$ echo -e "\033[31m -- Hello World! -- \033[m"
 -- Hello World! --

にパイプless:

$ echo -e "\033[31m -- Hello World! -- \033[m" | less
ESC[31m -- Hello World! -- ESC[m

ls、などの他のツールがどのようgrepにカラーで出力できるのか疑問に思っていましたが、パイプするとうまく見えlessますか?

4

4 に答える 4

10

環境を使用less -Rまたは追加LESS=-Rします。lessこれは、エスケープ シーケンス (色など) を通常の文字として出力する代わりに端末に渡すように要求します。

于 2011-11-22T00:08:22.523 に答える
8

grep とその仲間は、出力が端末へのものかどうかを検出します。less にパイプすると、そうではないため、カラーリングが無効になります。

を見てisatty、出力が端末かどうかを確認します。

色をあまり表示したくないので、これは非常に面倒なことがあることに注意してください。

alias less='less -SR'
alias grep='grep --color=always'

ANSIFilterも逆に見てください: 既存のストリームから ANSI エスケープをフィルター処理します (それを使用して、HTML、RTF、およびそれらから他の形式を生成することもできます)。

于 2011-11-22T00:06:41.240 に答える
6

あなたが言及するツールのほとんどは、プロセスの関連するファイル記述子(この場合はstdout)が端末に送られるかどうかを判断するC関数isatty()を呼び出します。

出力が端末用である場合、色、強調表示、ビープ音の生成、または人間のユーザーが価値を引き出すと思われるその他の機能を有効にします。端末がない場合は、他のツールの消化のために生のテキストを出力します。

あなたが書くとき

grep -v "Dogs" list-of-animals | less

grep からの isatty() 呼び出しは、端末ではなく、パイプにつながるファイル記述子で実行されます。したがって、ゼロが返され、errno が EINVAL または ENOTTY に設定され、grep は less に適した生のテキストを出力します。

于 2011-11-22T00:06:17.523 に答える
3

less が端末にカラー エスケープ シーケンスを渡すことを許可する場合は、次のようにします。

> echo -e "\033[31m -- Hello World! -- \033[m" | less -R

...または、すべてのエスケープ シーケンスを渡したい場合:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -r

于 2011-11-22T00:07:49.457 に答える