menos emular um TTY para preservar a saída de cores canalizadas

menos emular um TTY para preservar a saída de cores canalizadas

Quando você canaliza algo less, o programa geralmente descarta códigos de cores porque não está enviando para um TTY. Então você tem que adicionar --color=alwaysopções para que funcione.

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

O pior é que às vezes as coisas nem suportam essa opção, então não há como forçar a saída de cores para um canal.

Existe uma maneira (relativamente) fácil de emular menos um TTY para que eu não precise especificar --color=alwaystodos os programas quando as coisas são canalizadas para ele e ele exibe automaticamente a saída colorida quando possível?

Responder1

Não é lessisso que precisa mudar. A saída dos seus outros programas está sendo redirecionada para um canal. Esses programas detectam que sua saída não está sendo enviada para um tty e desativam sua coloração. Você terá que fazer algo especial com os programas de origem para colorir sua saída, mesmo quando redirecionado para um canal.

Acho que tenho uma solução para os programas que não suportam a opção --color=always. O unbuffercomando cria um pty e envia a saída de seu programa de argumento para esse pty, portanto, o programa de argumento pensa que sua saída está indo para um tty e o colore.

Eu tentei o seguinte como um experimento e funcionou. Não consegui pensar em nenhum programa que colorisse sua saída por padrão.

$ unbuffer ls --color=auto | cat

Além disso, você não precisa usar a -ropção with lesspara exibir cores? Eu também tentei isso:

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

Responder2

no FreeBSD você pode:

env CLICOLOR_FORCE=yes ls -l | less -R

ou você pode definir/substituir opções (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

em ~/.cshrc

Responder3

Se o programa usa isattypara determinar se deve usar cor ou não,
uma maneira de fazer isso é substituí-la usandoLD_PRELOAD

Crie uma versão de isatty que sempre retorne verdadeiro.

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

Compile-o e crie uma biblioteca compartilhada.

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

Use a variável de ambiente LD_PRELOAD para carregar a biblioteca compartilhada.

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

Responder4

Porém, não há como fazer com que less aloque um pty; portanto, os programas que dependem de um TTY para decidir sobre a saída de cores ou não precisam ser informados manualmente. Desculpe.

informação relacionada