
プログラム (たとえばgrep
またはls
) をページャなしで実行すると、その出力は色付きで表示されます。ただし、出力を にパイプして実行するとless
、色は表示されません。
たとえば、次のコマンドは色付きの出力を出力します。
grep -r something
しかし、これは当てはまりません:
grep -r something | less
なぜですか? どうすれば色が見えるのでしょうかless
?
答え1
ここでは 2 つの問題があります。
ls
色のサポートを自動検出するコマンドのようなコマンドは、パイプからのサポートを見つけられません。less
デフォルトではカラーコードのみを表示するように設定されています。
どちらも克服できますが、少し扱いにくいです。
ls --color=always | less -R
これはls
特定のものではありません。色をサポートする多くのコマンドには、オーバーライド引数もあります。
もう少し詳しく答えると、ls
STDOUT が実際の端末に属しているかどうかをチェックしているということです。パイプで処理すると、STDOUT は次のコマンドの STDIN に設定されます。
これは職場で見ることができますls
ソースコード内isatty
状況を判断するために、コマンド (コア POSIX インターフェイス)を使用しています。
色はデフォルトでオンになっていますか?
print_with_color = (i == color_always || (i == color_if_tty && isatty (STDOUT_FILENO)));
複数の列で出力してみます:
if (format == long_format) format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line); //... if (isatty (STDOUT_FILENO)) { format = many_per_line; set_quoting_style (NULL, shell_escape_quoting_style); qmark_funny_chars = true; } else { format = one_per_line; qmark_funny_chars = false; }
grep
非常に似た機能ですが、明示的にオーバーライドされない限り、次のようにして色のサポートを検出しますisatty
。
color_option = isatty (STDOUT_FILENO) && should_colorize ();
答え2
より一般的な色に興味がある場合はless
、 を参照してくださいlesspipe.sh
。たとえば、https://github.com/wofr06/lesspipe。
lesspipe.sh は、less のマニュアル ページで説明されているように、ページャー less の入力フィルターです。このスクリプトは ksh 互換シェル (bash、zsh など) で実行され、バイナリ コンテンツを含むファイル、圧縮ファイル、アーカイブ、およびアーカイブに含まれるファイルを less を使用して表示できます。
また、テキスト エディターと同様に、シェル スクリプト、Perl スクリプトなどをカラー化しますが、カラー化を行うための「前処理」プログラムは使用しません。
答え3
@oli の回答は、色を生成するコマンドに適切なフラグを提供できることを前提としています。コマンドがスクリプトなどに埋め込まれている場合は難しい場合があり、ターミナル環境で可能とされている場合に ANSI エスケープを生成する方法を知っているさまざまなコマンドに適切なフラグを個別に提供する方法を検討する必要があります。
@DaveEmme の回答によると、lesspipe を使用して任意のソースからの出力を色付けできるとのことですが、私の知る限り、出力が端末に送られるときに、すでに色を生成しているコマンドの色は保持されません。
ターミナルで問題なく動作するコマンドが既にある場合は、パイプされる出力に関係なくカラーエスケープが保持されるようにそのコマンドを実行できると便利です。そのため、それを に入力できますless -R
。
unbuffer
はこれを実行します。Debian では少なくとも で実行できますsudo apt install expect-dev
。
その後、次の操作を実行できます。
unbuffer [command] |& less -R
|&
の代わりにを使用することは|
不必要な詳細かもしれませんが、これは STDERR が STDOUT だけでなく less にもパイプされることを意味します。