Evita que la terminal Mac ilumine el color de la fuente sin fondo

2

Cuando ejecuto echo -e '3[49;36m\u25883[40;36m\u2588' en un terminal de Linux, obtengo dos bloques del mismo color:

Aquí,elprimerbloquenotienecolordefondo(49)mientrasqueelsegundobloquetieneuncolordefondonegro.Elcarácterquesemuestraengeneraldeberíaocupartodoelespacio,porloqueelfondonoesvisibleytienenelmismoaspecto.

Sinembargo,sirepitoestoenMacTerminal,obtengoalgomuysorprendente:

Por alguna razón, mac terminal está cambiando el color de primer plano para diferentes colores de fondo. A través de algunos experimentos, descubrí que el color de primer plano es constante para cualquier color de fondo fijo, y solo diferente para el color de fondo predeterminado. El color que representa es distinto de cualquiera de las otras modificaciones tenues o brillantes ofrecidas por los terminales ansi.

¿Por qué sucede esto y, lo que es más importante, puedo solucionarlo?

    
pregunta Erik 06.05.2017 - 23:19

1 respuesta

3

Respuesta corta: no use códigos de color "compuestos" como 3[49;36m , use instrucciones de color separadas como 3[0;42m3[0;36m en su lugar. La diferencia se puede ver bien comparando la salida de esos dos comandos:

echo -e "3[0;42;36m\xe2\x96\x883[0;49;36m\xe2\x96\x88"
echo -e "3[0;42m3[0;36m\xe2\x96\x883[0;49;36m\xe2\x96\x88"

(tenga en cuenta que mi versión de bash no pudo procesar \u2588 , por lo que tuve que recurrir a la variante hexadecimal \xe2\x96\x88 ).

Sugerencia para código futuro:

Cree un archivo (por ejemplo, en ~/.bash_color_definitions ) con el siguiente contenido:

# Setup some colors to use later in interactive shell or scripts

# Color reset:
export COLOR_RESET='3[0m' # reset color

# foreground colors

export FG_WHITE='3[1;37m'
export FG_BLACK='3[0;30m'
export FG_BLUE='3[0;34m' 
export FG_LIGHT_BLUE='3[1;34m'
export FG_GREEN='3[0;32m'
export FG_LIGHT_GREEN='3[1;32m'
export FG_CYAN='3[0;36m'
export FG_LIGHT_CYAN='3[1;36m'
export FG_RED='3[0;31m'
export FG_LIGHT_RED='3[1;31m'
export FG_PURPLE='3[0;35m'
export FG_LIGHT_PURPLE='3[1;35m'
export FG_BROWN='3[0;33m'
export FG_YELLOW='3[1;33m'
export FG_GRAY='3[1;30m'
export FG_LIGHT_GRAY='3[0;37m'


# background colors

export BG_WHITE='3[1;47m'
export BG_BLACK='3[0;40m'
export BG_BLUE='3[0;44m' 
export BG_LIGHT_BLUE='3[1;44m'
export BG_GREEN='3[0;42m'
export BG_LIGHT_GREEN='3[1;42m'
export BG_CYAN='3[0;46m'
export BG_LIGHT_CYAN='3[1;46m'
export BG_RED='3[0;41m'
export BG_LIGHT_RED='3[1;41m'
export BG_PURPLE='3[0;45m'
export BG_LIGHT_PURPLE='3[1;45m'
export BG_BROWN='3[0;43m'
export BG_YELLOW='3[1;43m'
export BG_GRAY='3[1;40m'
export BG_LIGHT_GRAY='3[0;47m'

Y obténgalo en cada inicio de bash poniendo source ~/.bash_color_definitions en su .bashrc o .bash_profile . Entonces comienza a producir un código más legible como este:

 echo -e "$BG_BLACK$FG_CYAN\xe2\x96\x88$BG_GRAY$FG_CYAN\xe2\x96\x88$COLOR_RESET"

EDIT:

Resulta que, el código de mi respuesta realmente restablece el fondo (como Erik señaló en los comentarios). Después de un poco de prueba, parece que la Terminal Mac "mezcla" los colores de primer plano / fondo un poco diferentes cuando intenta usar el código de color 49 , es decir, el "color de fondo predeterminado".

iTerm.app, por ejemplo, no se comporta de esta manera, por lo que puede cambiar fácilmente los terminales, si lo desea.

Sin embargo, una solución válida es especificar completamente el color de fondo (es decir, no solo use 49;36m , use 47;36m si su fondo es blanco). O mejor usa las especificaciones de color xterm-256color ; eso es 3[38;5;___m para el primer plano y 3[48;5;___m para los colores de fondo (reemplazando el guión bajo con un número en 0-255). Al menos en mi computadora, esto produce colores consistentes:

echo -e "3[48;5;256m3[38;5;6m\xe2\x96\x883[40;36m3[38;5;6m\xe2\x96\x883[0m"

Si desea comprobar qué color de fondo ANSI xterm-256 coincide mejor con su color de fondo real, puede usar este script (versión modificada del encontrado aquí ):

#!/bin/bash

for fgbg in 38 48 ; do #Foreground/Background
    for color in {0..256} ; do #Colors
        #Display the color
        echo -e "3[${fgbg};5;${color}m ${color}\t3[0m"
    done
    echo #New line
done

exit 0
    
respondido por el Asmus 07.05.2017 - 14:44

Lea otras preguntas en las etiquetas