menos emular un TTY para preservar la salida de color canalizado

menos emular un TTY para preservar la salida de color canalizado

Cuando canaliza algo less, el programa generalmente descarta los códigos de color porque no se envía a un TTY. Entonces tienes que agregar --color=alwaysopciones para que funcione.

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

Lo peor es que a veces las cosas ni siquiera admiten esa opción, por lo que en realidad no hay forma de forzar la salida de color a una tubería.

¿Existe una manera (relativamente) fácil de emular menos un TTY para no tener que especificar --color=alwaysen cada programa cuándo se canalizan las cosas y que muestre automáticamente la salida en color cuando sea posible?

Respuesta1

No es lessque sea necesario cambiar. La salida de sus otros programas se redirige a una tubería. Esos programas detectan que su salida no se envía a un tty y desactivan su coloración. Estás atascado en tener que hacer algo especial con los programas fuente para colorear su salida incluso cuando se redirige a una tubería.

Creo que tengo una solución para los programas que no admiten la opción --color=always. El unbuffercomando crea un pty y envía la salida de su programa de argumentos a ese pty, por lo tanto, el programa de argumentos cree que su salida irá a un tty y lo colorea.

Intenté lo siguiente como experimento y funcionó. No se me ocurre ningún programa que coloree su salida de forma predeterminada.

$ unbuffer ls --color=auto | cat

Además, ¿no es necesario utilizar la -ropción con lesspara que muestre el color? También probé esto:

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

Respuesta2

en FreeBSD puedes:

env CLICOLOR_FORCE=yes ls -l | less -R

o puede configurar/anular opciones (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

en ~/.cshrc

Respuesta3

Si el programa utiliza isattypara determinar si usar color o no,
una forma de hacerlo es anularlo usandoLD_PRELOAD

Crea una versión de isatty que siempre devuelva verdadero.

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

Compílelo y cree una biblioteca compartida.

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

Utilice la variable de entorno LD_PRELOAD para cargar la biblioteca compartida.

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

Respuesta4

Sin embargo, no hay ninguna manera de asignar menos un pty, por lo que los programas que dependen de un TTY para decidir si generar o no color deben ser indicados manualmente. Lo siento.

información relacionada