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=always
opçõ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=always
todos os programas quando as coisas são canalizadas para ele e ele exibe automaticamente a saída colorida quando possível?
Responder1
Não é less
isso 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 unbuffer
comando 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 -r
opção with less
para 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 isatty
para 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.