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=always
opciones 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=always
en cada programa cuándo se canalizan las cosas y que muestre automáticamente la salida en color cuando sea posible?
Respuesta1
No es less
que 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 unbuffer
comando 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 -r
opción con less
para 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 isatty
para 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.