Helligkeit kann nicht auf die Hintergrundfarbe des Terminals angewendet werden

Helligkeit kann nicht auf die Hintergrundfarbe des Terminals angewendet werden

Ich habe ein Problem mit den Farben in meinem Terminalemulator. Ich verwende ihn LXTerminalals Terminalemulator und LXDEals Desktopumgebung.

Der folgende Befehl soll roten Text auf grauem Hintergrund drucken:

printf "\n\033[1;31;40m"hello"\033[00m\n\n"

aber das funktioniert nicht. Der graue Hintergrund fehlt (roter Text ist OK). Auf meiner älteren Maschine ( Gnome/Gnome Terminal) funktioniert alles einwandfrei

Ich habe versucht, mehrere andere Terminalemulatoren zu installieren, aber das Problem besteht weiterhin. Ich bin mir nicht einmal sicher, ob dieses Problem mit dem Terminalemulator oder etwas anderem zusammenhängt. In der Konsole (STRG+ALT+F1) funktioniert die graue Hintergrundfarbe auf beiden Computern nicht.)

Dieses Problem ist nur auf grauen Hintergrund beschränkt. Alle anderen Farben funktionieren einwandfrei. Im Folgenden wird beispielsweise roter Text auf grünem Hintergrund gedruckt.

printf "\n\033[1;31;42m"hello"\033[00m\n\n"

Ich wäre für jede Hilfe dankbar. Ich weiß nicht einmal, wo ich mit der Fehlersuche beginnen soll.

Antwort1

Es gibt acht Standard-ANSI-Farben, die von jedem Terminalemulator unterstützt werden. Die meisten Terminalemulatoren verfügen außerdem über acht helle Varianten der Standard-ANSI-Farben.

Die tatsächlichen Farbwerte, denen die Escape-Codes entsprechen, sind jedoch nicht standardisiert und können je nach Terminalemulator leicht variieren. Wenn Sie also printf "\e[31;47mTest\n"roten Text auf weißem Hintergrund drucken, können die tatsächlichen Rot- und Weißtöne je nach verwendetem Terminalemulator unterschiedlich sein.

Das erklärt das Problem teilweise: Farbwerte sind nicht standardisiert und LXTerminalhaben möglicherweise andere Standardwerte für die Farbpalette, an die Sie nicht gewöhnt sind. Wenn Sie sich in den Einstellungen umsehen, können Sie das Farbschema normalerweise nach Ihren Wünschen konfigurieren.

Das andere Problem, mit dem Sie konfrontiert sind, ist, dass die Funktion des Fett-Attributs ebenfalls nicht standardisiert ist. Es gibt drei Möglichkeiten: Es kann die Schrift fett machen, es kann die Vordergrundfarbe heller machen oder es kann sowohl die Vordergrundfarbe heller machen als auch die Schrift fett machen.

Auch hier ist das Standardverhalten je nach Terminalemulator unterschiedlich und Sie können es normalerweise ändern, wenn Sie die richtige Einstellung finden. Suchen Sie mit Grep nach etwas, das „fett“ oder „hell“ erwähnt.

Wenn Sie eine helle Farbe verwenden möchten, können Sie anstelle von „bold“ die sogenannten aixterm-Farb-Escape-Codes verwenden. Diese sind nicht standardmäßig, werden aber von jedem mir bekannten modernen Terminalemulator unterstützt. Im Gegensatz zu „bold“ verwenden sie immer helle Farben und können außerdem verwendet werden, um helle Hintergrundfarben anzuzeigen.

Wenn Sie beispielsweise leuchtend roten Text auf einem strahlend weißen Hintergrund drucken möchten, gehen Sie wie folgt vor: printf "\e[91;107mTest\n".

Als Referenz finden Sie hier eine Tabelle mit allen Farb-Escape-Codes:

|    ANSI |    ANSI |    ANSI    |                | Aixterm | Aixterm 
|   Color | FG Code | BG Code    | Bright Color   | FG Code | BG Code 
+---------+---------+--------    +----------------+---------+-------- 
|   Black |      30 |      40    |   Bright Black |      90 |     100 
|     Red |      31 |      41    |     Bright Red |      91 |     101 
|   Green |      32 |      42    |   Bright Green |      92 |     102 
|  Yellow |      33 |      43    |  Bright Yellow |      93 |     103 
|    Blue |      34 |      44    |    Bright Blue |      94 |     104 
| Magenta |      35 |      45    | Bright Magenta |      95 |     105 
|    Cyan |      36 |      46    |    Bright Cyan |      96 |     106 
|   White |      37 |      47    |   Bright White |      97 |     107 

Antwort2

Das 1Attribut am Anfang 1;31;40aktiviert den „fetten“ (auch „hellen“) Modus, aber manche Terminals wenden dies nur auf die Vordergrundfarbe an. Ich habe keine Ahnung, warum (und das Ändern der Variable $TERM macht keinen Unterschied), da sie 16 Farben im Vordergrund unterstützen. 1 0 (von 40: 4 = Hintergrund, 0 = die Farbe) ist eigentlich schwarz, aber „helles Schwarz“ ist grau. Hier sind zwei Lösungen:

  • Farbe 7 (Weiß) wird sich wahrscheinlich als Grau und nicht als Weiß herausstellen (für echtes Weiß benötigen Sie „strahlendes Weiß“, was bedeutet, dass der Hintergrund, den Sie eigentlich nicht haben können, weiß ist).

  • Sie sollten in der Lage sein, das Gnome-Terminal in LXDE zu verwenden, wenn Sie möchten. Installieren Sie es einfach und starten Sie mit gnome-terminal(ich glaube, das ist der Befehlsname). Dann müssen Sie alle Starter so konfigurieren, dass sie es anstelle des LX-Terminals verwenden.

1 Hier ist meine Vermutung: Beachten Sie, dass die Einstellung „fett“ die Helligkeit auf die Vordergrundfarbe anwendetUndfügt eine fette Hervorhebung hinzu. Daher können Sie keine helle Vordergrundfarbe verwenden, ohne auch Fettdruck anzuwenden. Vermutlich war es damals, als monochrome Terminals üblich waren, einfach Fettdruck zur Hervorhebung zu verwenden, z. B.: \\033[1mBlah blah\\033[0m– und tatsächlich funktioniert dies immer noch, aber es wird auch Ihre Vordergrundfarbe hell machen. Wenn wir es für unerwünscht hielten, dass dies auch den Hintergrund aufhellt (weil es einfach fett sein soll), würden wir sicherstellen, dass die Implementierung dies nicht tut. Na ja.

Antwort3

Hier ist ein Trick, den Sie mit einigen Terminalemulatoren verwenden können. Er erzeugt helle Hintergrundfarben, indem Sie das Reverse-Video-Attribut (7) verwenden, um eine helle Vordergrundfarbe auszuwählen und diese dann mit der Hintergrundfarbe zu vertauschen.

echo -e "\e[1;32;7mText on a bright green background"

Der Haken ist, dass Sie zwar jetzt 16 Hintergrundfarben haben können, die Beschränkung auf 8 Farben jetzt aber stattdessen für den Vordergrund/Text gilt. Und um die Sache noch verwirrender zu machen: Während das Invertierungsattribut aktiv ist, müssen Sie die Textfarbe mithilfe der Attributcodes für Hintergrundfarben festlegen!

Antwort4

Mit 47=background whitestatt 40=background blackerhalten Sie das nicht fette Weiß als Hintergrund.

]# printf "\033[0;30;47m"hello"\033[00m\n"
hello (black on grey)
]# printf "\033[1;30;47m"hello"\033[00m\n"
hello (darkgrey on grey)
]# printf "\033[1;37;47m"hello"\033[00m\n"
hello (white on grey)
]# printf "\033[0;37;47m"hello"\033[00m\n"
hello (INVISIBLE grey on grey)

Kräftiges Schwarz ergibt standardmäßig Dunkelgrau. Normales Weiß ist eigentlich Grau, denn kräftiges Weiß ist Weiß.


Diese Schleife druckt zwei Spalten mit allen Farbe-auf-Schwarz- und Weiß-auf-Farbe-Kombinationen.

for ((i=30; i<=47; i++))
do
    echo -en  "\e[${i}mHello\e[0m";
    echo -e "\e[1;${i}mHello\e[0m";
done

Es beginnt mit unsichtbarem Schwarz und Dunkelgrau auf Schwarz, aber die anderen 17 Linien sehen gut aus und zeigen die gesamte Farbpalette der Konsole.

(38 und 39 sollten weggelassen werden, aber der Einfachheit halber gehe ich einfach von 30 bis 47)


Akzeptiert A. erwähntachtFarben und fehlende Standards.

Die sechs Farben 31-36 (Rot bis Cyan) sind gut definiert. Schwarz (30) und Weiß (37) ebenfalls, ihre kräftigen Varianten jedoch weniger, insbesondere als Hintergrund (40 und 47).


Mir fällt gerade auf: in xterm ist der normale weiße Text auf grauem Hintergrund sichtbar, in der Linux-Konsole jedoch nicht. (letzte Zeile mit i=47) (bis vor 30 Minuten blieb das Skript bei 46 stehen, weil ich keine unlesbaren Varianten wollte)

An beiden Stellen passt es sich bei Mausauswahl geschickt an und bleibt auch beim Umdrehen lesbar.

verwandte Informationen