パイプカラー出力を維持するためにTTYをエミュレートしない

パイプカラー出力を維持するためにTTYをエミュレートしない

何かをパイプするとless、プログラムは TTY に出力しないため、通常はカラー コードを破棄します。そのため、--color=always動作させるにはオプションを追加する必要があります。

ls -l --color=always | less
grep -R asdf --color=always | less

さらに悪いことに、場合によってはそのオプションがサポートされていないため、パイプにカラー出力を強制する方法が実際にはありません。

less で TTY をエミュレートして、パイプ処理が行われるときに各プログラムに指定する必要がなく--color=always、可能な場合は自動的にカラー出力が表示されるようにする (比較的) 簡単な方法はありますか?

答え1

変更する必要があるのは、これではありませんless。他のプログラムの出力はパイプにリダイレクトされています。これらのプログラムは、出力が tty に送信されていないことを検出し、色付けを無効にします。パイプにリダイレクトされている場合でも、出力に色を付けるためにソース プログラムで特別な操作を行う必要があります。

--color=always オプションをサポートしていないプログラムに対する解決策があると思います。このunbufferコマンドは pty を作成し、その引数プログラムの出力をその pty に送信します。そのため、引数プログラムは出力が tty に送られると認識し、色付けします。

実験として次のことを試してみたところ、うまくいきました。デフォルトで出力に色を付けるプログラムは思いつきませんでした。

$ unbuffer ls --color=auto | cat

また、色を表示するには、-rオプションを使用する必要があるのではないですか? これも試しました:less

$ unbuffer ls --color=auto | less -r

答え2

FreeBSD では次のことが可能です:

env CLICOLOR_FORCE=yes ls -l | less -R

または、オプションを設定/上書きすることもできます (csh/tcsh):

alias less less -R
setenv CLICOLOR_FORCE yes
setenv  LS_COLORS "no=00:fi=00:di=01;36:ln=01;37;44:pi=40;33:so=01;35"
setenv  LS_COLORS "$LS_COLORS":"bd=40;33;01:cd=40;33;01:or=40;31;01"
setenv  LS_COLORS "$LS_COLORS":"ex=01;32;40:*.tar=01;31:*.tgz=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.arj=01;31:*.taz=01;31:*.lzh=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.zip=01;31:*.z=01;31:*.Z=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.gz=01;31:*.deb=01;31:*.jpg=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.gif=01;35:*.bmp=01;35:*.ppm=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.tga=01;35:*.xbm=01;35:*.xpm=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.tif=01;35:*.mpg=01;37:*.avi=01;37"
setenv  LS_COLORS "$LS_COLORS":"*.gl=01;37:*.dl=01;37:*.tex=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.ps=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.php=01;33"
setenv  LS_COLORS "$LS_COLORS":"*.sh=00;31"
setenv  LS_COLORS "$LS_COLORS":"*.txt=01;37:*.conf=01;37:*.config=01;37"
setenv  LSCOLORS GxExcxdxCxegedabagacad

~/.cshrc 内

答え3

プログラムがisatty色を使用するかどうかを決定するために を使用する場合、
それを行う方法の1つは、以下を使用してそれを上書きすることです。LD_PRELOAD

常に true を返す isatty のバージョンを作成します。

echo "int isatty(int x) { (void) x; return 1 ;}" > isatty_override.c

コンパイルして共有ライブラリを作成します。

gcc -c -fPIC isatty_override.c -o isatty_override.o
gcc isatty_override.o -shared -o isatty_override.so

LD_PRELOAD 環境変数を使用して共有ライブラリをロードします。

LD_PRELOAD=./isatty_override.so ls -l | less

答え4

ただし、less に pty を割り当てさせる方法はないので、カラーを出力するかどうかを決定するために TTY に依存するプログラムには手動で指示する必要があります。申し訳ありません。

関連情報