menos emular um TTY para preservar a saída de cor canalizada

3

Quando você canaliza algo através de less , o programa geralmente descarta códigos de cores porque não está saindo para um TTY. Então você tem que adicionar --color=always às opções para que ele funcione.

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

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

Existe uma maneira (relativamente) fácil de fazer menos emular um TTY para que eu não tenha que especificar --color=always para cada programa quando as coisas forem canalizadas para ele, e ele exibe automaticamente a saída de cores quando possível?

    
por goweon 03.02.2012 / 23:47

5 respostas

15

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

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

Eu tentei o seguinte como um experimento e funcionou. Eu não conseguia 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 opção -r com less para exibir a cor? Eu também tentei isso:

$ unbuffer ls --color=auto | less -r
    
por 04.02.2012 / 01:34
3

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

    
por 11.03.2012 / 13:26
2

Se o programa usa isatty para determinar se deseja usar cores ou não,
Uma maneira de fazer isso é sobrescrevê-lo usando LD_PRELOAD

Crie uma versão do isatty que sempre retorne true.

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

Compile e crie uma biblioteca compartilhada.

gcc -c -fPIC isatty_override.c -o isatty_override.o e 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

    
por 06.04.2018 / 03:14
0

Não há como fazer menos alocação de arquivos, portanto programas que dependem de um TTY para decidir a saída de cores ou não precisam ser informados manualmente. Desculpe.

    
por 03.02.2012 / 23:48
0

No Bash shell do FreeBSD, para fazer o trabalho de cores usando menos, faça o seguinte ...

$ export CLICOLOR_FORCE=yes
$ ls -G | less -R

Você pode adicionar o comando de exportação ao seu .bashrc ou .bash_profile .

    
por 05.08.2012 / 07:14