7 votos

Evitar que el terminal de Mac aclare el color de la fuente sin fondo

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

linux colored blocks

Aquí, el primer bloque no tiene color de fondo (49) mientras que el segundo bloque tiene un color de fondo negro. Por lo general, el carácter mostrado debe ocupar todo el espacio, de modo que el fondo no sea visible y aparezcan igual.

Sin embargo, si repito esto en Mac Terminal obtengo algo muy sorprendente:

enter image description here

Por alguna razón, el terminal de mac está cambiando el color de primer plano para diferentes colores de fondo. A través de algunos experimentos, he encontrado que el color de primer plano es constante para cualquier color de fondo fijo, y sólo diferente para el color de fondo por defecto. El color que se muestra es distinto a cualquiera de las otras modificaciones tenues o brillantes que ofrecen las terminales ansi.

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

4voto

James Socol Puntos 146

Respuesta corta: no utilice códigos de colores "compuestos" como \033[49;36m Utiliza instrucciones de color separadas como \033[0;42m\033[0;36m en su lugar. La diferencia se puede ver muy bien comparando la salida de esos dos comandos:

echo -e "\033[0;42;36m\xe2\x96\x88\033[0;49;36m\xe2\x96\x88"
echo -e "\033[0;42m\033[0;36m\xe2\x96\x88\033[0;49;36m\xe2\x96\x88"

(nota que mi versión de bash no pudo procesar \u2588 Así que tuve que recurrir a la variante hexagonal \xe2\x96\x88 ).

Sugerencia para el código futuro:

Crear 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='\033[0m' # reset color

# foreground colors

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

# background colors

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

Y la fuente en cada inicio de bash poniendo source ~/.bash_color_definitions en su .bashrc o .bash_profile . Entonces empieza 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"

EDITAR:

Resulta que el código en mi respuesta en realidad restablece el fondo (como Erik señaló en los comentarios). Después de un poco de pruebas, parece que el Terminal de Mac "mezcla" los colores de primer plano/fondo un poco diferente cuando se intenta utilizar el código de color 49 es decir, el "color de fondo por defecto".

iTerm.app, por ejemplo, no se comporta de esta manera, por lo que podría cambiar fácilmente de terminal, si así lo desea.

Una solución válida, sin embargo, es especificar completamente el color de fondo (es decir, no sólo usar 49;36m Utilizar 47;36m si su fondo es blanco). O mejor, utilice el xterm-256color especificaciones de color; es decir \033[38;5;___m para el primer plano y \033[48;5;___m para los colores de fondo (sustituyendo el guión bajo por un número en 0-255). Al menos en mi ordenador, esto produce colores consistentes:

echo -e "\033[48;5;256m\033[38;5;6m\xe2\x96\x88\033[40;36m\033[38;5;6m\xe2\x96\x88\033[0m"

Si quieres comprobar cuál es el color ANSI xterm-256color que mejor se ajusta a tu color de fondo real, podrías utilizar este script (versión modificada del se encuentra aquí ):

#!/bin/bash

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

exit 0

0 votos

Esto no funciona en mi máquina. Incluso cuando separo los códigos de color, sigo obteniendo una diferencia de color. La razón por la que tu ejemplo inicial funciona es porque estás usando el código de color compuesto \033[0;36m donde el 0 está borrando el estilo de fondo especificado anteriormente, por lo que ambos bloques se ven igual, pero también tienen el mismo color de fondo (por defecto)

0 votos

@Erik tienes razón, mi respuesta no era correcta. La he actualizado y espero que ahora te sirva.

0 votos

Esto sí parece un error de Terminal.app, pero ninguna de las dos soluciones que planteas es genial. Cambiar a iTerm está bien, y probablemente es lo que acabaré haciendo, pero en realidad no soluciona el problema. El arreglo con colores más grandes es una buena solución local, pero esto es parte de un script que uso en muchas computadoras con diferentes temas de color, y requerir la configuración en cada computadora, y la reconfiguración si el tema de color cambia no es ideal.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X