Verhindert, dass das Mac-Terminal Schriftfarben ohne Hintergrund aufhellt

2

Wenn ich echo -e '\033[49;36m\u2588\033[40;36m\u2588'in einem Linux-Terminal ausführe , erhalte ich zwei Blöcke der gleichen Farbe:

Linux farbige Blöcke

Hier hat der erste Block keine Hintergrundfarbe (49), während der zweite Block eine schwarze Hintergrundfarbe hat. Das angezeigte Zeichen sollte im Allgemeinen den gesamten Platz einnehmen, damit der Hintergrund nicht sichtbar ist und sie gleich aussehen.

Wenn ich dies jedoch im Mac Terminal wiederhole, erhalte ich etwas sehr Überraschendes:

Bildbeschreibung hier eingeben

Aus irgendeinem Grund ändert das Mac-Terminal die Vordergrundfarbe für verschiedene Hintergrundfarben. Durch einige Experimente habe ich herausgefunden, dass die Vordergrundfarbe für jede feste Hintergrundfarbe konstant ist und sich nur für die Standardhintergrundfarbe unterscheidet. Die Farbe, die es wiedergibt, unterscheidet sich von allen anderen dunklen oder hellen Modifikationen, die von Ansi-Terminals angeboten werden.

Warum geschieht dies und was noch wichtiger ist, kann ich es beheben?

Erik
quelle

Antworten:

3

Kurze Antwort: Verwenden Sie keine "zusammengesetzten" Farbcodes wie \033[49;36m, \033[0;42m\033[0;36msondern separate Farbanweisungen wie . Der Unterschied wird deutlich, wenn man die Ausgabe dieser beiden Befehle vergleicht:

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"

(Beachten Sie, dass meine Version von bash nicht verarbeitet werden konnte \u2588, sodass ich auf die hexadezimale Variante zurückgreifen musste \xe2\x96\x88).

Vorschlag für zukünftigen Code:

Erstellen Sie eine Datei (zum Beispiel in ~/.bash_color_definitions) mit folgendem Inhalt:

# 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'

Und geben Sie es bei jedem Bash-Start source ~/.bash_color_definitionsin Ihr .bashrcoder ein .bash_profile. Dann fang an, besser lesbaren Code zu produzieren:

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

BEARBEITEN:

Es stellte sich heraus, dass der Code in meiner Antwort tatsächlich den Hintergrund zurücksetzte (wie Erik in den Kommentaren vermerkte). Nach einigem Testen sieht es so aus, als ob das Mac Terminal die Vordergrund- / Hintergrundfarben etwas anders "mischt", wenn Sie versuchen, einen Farbcode zu verwenden 49, dh die "Standardhintergrundfarbe".

iTerm.app zum Beispiel verhält sich nicht so, so dass Sie leicht zwischen Terminals wechseln können, wenn Sie möchten.

Eine gültige Lösung besteht jedoch darin, die Hintergrundfarbe vollständig anzugeben (dh nicht nur verwenden 49;36m, sondern verwenden , 47;36mwenn Ihr Hintergrund weiß ist). Oder besser die xterm-256colorFarbangaben verwenden; das ist \033[38;5;___mfür den Vordergrund und \033[48;5;___mfür die Hintergrundfarben (Ersetzen des Unterstrichs durch eine Zahl in 0-255). Zumindest auf meinem Computer erzeugt dies dann konsistente Farben:

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"

Wenn Sie überprüfen möchten, welche ANSI xterm-256-Farbe am besten zu Ihrer tatsächlichen Hintergrundfarbe passt, können Sie dieses Skript verwenden (geänderte Version von der hier gefundenen ):

#!/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
Asmus
quelle
Dies funktioniert nicht auf meinem Computer. Selbst wenn ich die Farbcodes heraus trenne, bekomme ich immer noch einen Farbunterschied. Der Grund, warum Ihr erstes Beispiel funktioniert, ist, dass Sie den zusammengesetzten Farbcode verwenden \033[0;36m, bei dem die 0 den zuvor angegebenen Hintergrundstil löscht, sodass beide Blöcke gleich aussehen, aber auch dieselbe Hintergrundfarbe haben (Standard)
Erik
@ Erik du hast recht, meine antwort war nicht richtig. Ich habe es aktualisiert und hoffe, dass es jetzt für Sie funktioniert.
Asmus
Dies scheint ein Fehler in Terminal.app zu sein, aber keine der von Ihnen vorgeschlagenen Lösungen ist großartig. Der Wechsel zu iTerm ist in Ordnung und wahrscheinlich das, was ich am Ende tun werde, aber das Problem wird damit nicht wirklich behoben. Die Korrektur mit größeren Farben ist eine nette lokale Lösung, aber dies ist Teil eines Skripts, das ich auf vielen Computern mit unterschiedlichen Farbthemen verwende und das auf jedem Computer eine Konfiguration erfordert. Eine Neukonfiguration, falls sich das Farbthema ändert, ist nicht ideal.
Erik
@Erik Wenn Sie dieses Skript auf "vielen Computern mit unterschiedlichen Farbthemen" verwenden, würde ich mich überhaupt nicht auf die "Standardhintergrundfarbe" ( 49) verlassen, wenn ich Sie wäre. Ich habe keine Ahnung, was Ihr Skript tatsächlich macht und warum dieser winzige Farbunterschied für Sie so wichtig ist (zumal Sie nicht einmal 256 Farben verwenden und es höchstwahrscheinlich nicht alle Computer kalibriert sind), aber wenn Sie nicht spezifizieren können Mit einer deutlichen Hintergrundfarbe wechseln Sie am besten die Terminal-Apps.
Asmus
In meinem speziellen Fall verwende ich dies für eine benutzerdefinierte Powerline-Eingabeaufforderung. Ich brauche die Farbe 49, um mit dem Rest der Eingabeaufforderung übereinzustimmen, und aufgrund der Powerline brauche ich die Vordergrundfarbe einer Glyphe, um mit der Hintergrundfarbe der vorherigen zu übereinstimmen. Dies sollte jedoch unabhängig vom Farbschema im ansi-Terminal funktionieren.
Erik