Obteniendo resultados coloreados inesperados en varios comandos

8

Acabo de agregar esto a mi .bashrcpara obtener resultados coloreados con less:

# Colorize less man pages.
export LESS_TERMCAP_md=$'\e[01;34m'
export LESS_TERMCAP_us=$'\e[01;33m'
export LESS_TERMCAP_so=$'\e[01;44;37m'
export LESS_TERMCAP_mb=$'\e[01;31m'
export LESS_TERMCAP_mr=$'\e[01;35m'
export LESS_TERMCAP_me=$'\e[00m'
export LESS_TERMCAP_ue=$'\e[00m'
export LESS_TERMCAP_se=$'\e[00m'

... y ahora, de repente, ciertos comandos (parecen estar relacionados con la visualización de variables de entorno) producen una salida de color que coincide con estas nuevas configuraciones. ¿Me estoy escapando mal? ¿O es este comportamiento intencional? Intenté algunas otras variaciones de escape, pero no funcionaron less.

Por ejemplo, aquí hay una captura de pantalla de un envcomando.

comando env

php -i también tiene salida coloreada, pero solo en la sección de variables de entorno.

comando php -i

Jeff
fuente

Respuestas:

4

Este es un comportamiento normal. Estas variables de entorno contienen secuencias de escape que hacen que el terminal cambie su color de primer plano. Obtiene el mismo efecto visual cuando cualquier programa los emite, ya sea lesso env.

Estas variables deben contener los caracteres de escape reales, menos no hace ningún procesamiento posterior en ellos.

Normalmente, puede poner menos variables de configuración en su archivo lesskey , pero esto no funciona para las LESS_TERMCAP_xxvariables, porque menos las lee antes de que lea el archivo lesskey (a partir de menos 444). Entonces no tiene más remedio que ponerlos en el medio ambiente.

Si desea que estas variables se apliquen solo a manotros usos y no a otros less, puede usar un alias para manque establezca la PAGERvariable en un script de contenedor que establezca las variables de entorno.

#!/bin/sh
escape=␛     # a literal escape character
export LESS_TERMCAP_md=$escape'[01;34m'

exec less "$@"

(Alternativamente, use #!/bin/bashen la primera línea y puede usar la #'\e'sintaxis para obtener un carácter de escape. En los sistemas donde /bin/shestá el guión, el uso /bin/shes muy ligeramente más rápido, aunque puede no ser notable en la práctica).

Llame a este script less-colory agréguelo alias man='PAGER=less-color man'a su ~/.bashrco ~/.zshrc. En algunos sistemas, en lugar de crear un alias, puede indicar manque use un localizador diferente configurando la MANPAGERvariable de entorno: export MANPAGER=less-coloren su ~/.profile.

Gilles 'SO- deja de ser malvado'
fuente
1

Supongo que ha configurado erróneamente los valores de esas LESS_ * variables en cadenas que contienen caracteres de escape reales, a diferencia de las cadenas que contienen una barra invertida seguida de una e. Por lo tanto, cada vez que muestra esos valores, cambian el color de su terminal.

Examinaría con mucho cuidado la configuración que realizó en su .bashrc y me aseguraría de que sea correcta. Sospecho que todo lo que necesita hacer es eliminar el signo del dólar.

offby1
fuente
Quitar el signo del dólar arruina mis páginas de manual. Por ejemplo, man top= en \e[01;34mSYNOPSIS\e[00mlugar de colorear la palabra "SINOPSIS".
Jeff
El signo de dólar no funcionó. ¿Se te ocurre una solución alternativa? ¿Quizás una forma de restringir esas MENOS variables para que solo se usen en páginas de manual?
Jeff
0

Como @Gilles señala en su respuesta, este es un comportamiento esperado.

Permítanme agregar información de pareja. LESS_TERMCAP_xxanular las capacidades de TERMCAP. Esta anulación se administra por lesssí misma screen.cy el valor se usa más adelante como si fuera devuelto por la biblioteca TERMCAP. Eso significa que tiene que ser una secuencia cruda de caracteres de control.

Mi cuenta de cómo "arreglar" este es envolver lessen sí

$ cat ~/bin/less 
#!/bin/bash

# Start bold mode
export LESS_TERMCAP_md=$'\e[1;37m'
# Start standout mode
export LESS_TERMCAP_so=$'\e[1;37;41m'
# End standout mode
export LESS_TERMCAP_se=$'\e[0m'
# Start underlining
export LESS_TERMCAP_us=$'\e[4;93m'
# End underlining
export LESS_TERMCAP_ue=$'\e[0m'
# End all mode like so, us, mb, md and mr
export LESS_TERMCAP_me=$'\e[0m'

exec /usr/bin/less "$@"
Miroslav Koškár
fuente
Es curioso, estoy trabajando en esto ahora y se ve bien. ¿Tiene una versión que también funciona #!/bin/sh(que es guión, en mi caso)? No puedo entender cómo insertar un ESCcarácter literal con vim.
Jeff
1
@ Jeff Solo desde lo alto de mi cabeza siempre puedes hacer algo como export LESS_TERMCAP_me="$(printf '\e[0m')". En realidad, si miras la respuesta de @Gilles, él afirma que también export LESS_TERMCAP_me=$escape'[0m'debería funcionar /bin/sh.
Miroslav Koškár