web-dev-qa-db-ja.com

「少ない」出力色を作成するにはどうすればよいですか?

ページャーなしでプログラム(たとえばgrepまたはls)を実行すると、その出力に色が付きます。ただし、出力をlessにパイピングして実行すると、色が表示されません。

たとえば、次のコマンドは色付きの出力を出力します。

grep -r something

しかし、これはしません:

grep -r something | less

どうして? lessを通して色を見るにはどうすればよいですか?

24

ここには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 ();
34
Oli

より一般的にlessの色に興味がある場合は、lesspipe.shをご覧ください。たとえば、 http://freecode.com/projects/lesspipe を参照してください。

lesspipe.shは、lessのマニュアルページで説明されているページャーlessの入力フィルターです。このスクリプトはksh互換シェル(bash、zshなど)で実行され、lessを使用して、バイナリコンテンツのファイル、圧縮ファイル、アーカイブ、およびアーカイブに含まれるファイルを表示できます。

また、テキストエディターと同様にシェルスクリプト、Perlスクリプトなどを色付けしますが、色付けを行うための「前処理」プログラムを使用しません。

2
DaveEmme