ページャーなしでプログラム(たとえばgrep
またはls
)を実行すると、その出力に色が付きます。ただし、出力をless
にパイピングして実行すると、色が表示されません。
たとえば、次のコマンドは色付きの出力を出力します。
grep -r something
しかし、これはしません:
grep -r something | less
どうして? less
を通して色を見るにはどうすればよいですか?
ここには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 ();
より一般的にless
の色に興味がある場合は、lesspipe.sh
をご覧ください。たとえば、 http://freecode.com/projects/lesspipe を参照してください。
lesspipe.shは、lessのマニュアルページで説明されているページャーlessの入力フィルターです。このスクリプトはksh互換シェル(bash、zshなど)で実行され、lessを使用して、バイナリコンテンツのファイル、圧縮ファイル、アーカイブ、およびアーカイブに含まれるファイルを表示できます。
また、テキストエディターと同様にシェルスクリプト、Perlスクリプトなどを色付けしますが、色付けを行うための「前処理」プログラムを使用しません。