Die Hintergrundfarbe des Terminals kann nicht hell gemacht werden

7

Ich habe ein Problem mit den Farben in meinem Terminalemulator. Ich verwende LXTerminalals Terminalemulator und LXDEals Desktop-Umgebung.

Der folgende Befehl soll roten Text auf grauem Hintergrund drucken:

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

aber das geht 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ürde mich über jede Hilfe freuen. Ich weiß nicht einmal, wo ich mit der Fehlerbehebung beginnen soll.

Martin Vegter
quelle
Was echo $TERMdruckt?
Terdon
@terdon Es wird keinen Unterschied machen.
Goldlöckchen
@goldilocks ist nicht das $TERMLesen, um zu bestimmen, wie Escape-Sequenzen behandelt werden sollen?
Terdon
1
@terdon: nein, $TERMwird durch (n) lesen Flüche / Slang /...- Programme , um festzustellen , welche Escape - Sequenzen zu senden .
Ninjalj
1
@ Goldlöckchen: konsolekann es überTERM=konsole-256color tput setab 8; echo foobar; tput setab 0
Ninjalj

Antworten:

10

Es gibt acht Standard-ANSI-Farben, die von jedem Terminalemulator unterstützt werden. Die meisten Terminalemulatoren haben auch acht helle Varianten der Standard-ANSI-Farben.

Die tatsächlichen Farbwerte, denen die Escape-Codes zugeordnet sind, sind jedoch nicht standardisiert, und tatsächlich variieren sie häufig geringfügig zwischen den Terminalemulatoren. 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.

Dies erklärt teilweise das Problem: Farbwerte sind nicht Standard und haben LXTerminalmöglicherweise andere Standardeinstellungen für die Farbpalette, an die Sie nicht gewöhnt sind. Wenn Sie sich in den Einstellungen umschauen, können Sie das Farbschema normalerweise so konfigurieren, wie Sie möchten.

Das andere Problem, mit dem Sie konfrontiert sind, ist, dass das, was das fettgedruckte Attribut tatsächlich tut, auch 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 variiert das Standardverhalten zwischen den Terminalemulatoren, und Sie können es normalerweise ändern, wenn Sie die richtige Einstellung finden. Greifen Sie nach etwas, das "fett" oder "hell" erwähnt.

Wenn Sie eine helle Farbe verwenden möchten, können Sie anstelle von Fett die sogenannten aixterm-Farb-Escape-Codes verwenden. Diese sind nicht Standard, werden aber in jedem mir bekannten modernen Terminalemulator unterstützt. Im Gegensatz zu Fettdruck verwenden sie immer helle Farben und können zur Anzeige heller Hintergrundfarben verwendet werden.

Wenn Sie beispielsweise leuchtend roten Text auf hellweißem Hintergrund drucken möchten, gehen Sie folgendermaßen vor : printf "\e[91;107mTest\n".

Als Referenz finden Sie hier eine Tabelle aller 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 
Matt
quelle
Tatsächlich ist das Problem nicht auf diese "Escape-Codes" beschränkt. Ich habe das gleiche Problem mit joe editor. In gnome-terminalkann ich grauen Hintergrund sehen. Darin LXTerminalfehlt.
Martin Vegter
Und Sie haben Recht mit den tatsächlichen Farben, die zwischen verschiedenen Terminalemulatoren variieren. Wenn ich Mitternachtskommandant in LXTerminalund öffne gnome-terminal, sieht die blaue Farbe ganz anders aus. Aber zurück zu meinem ursprünglichen Problem: Der graue Hintergrund in LXTerminalhat nicht nur eine andere Farbe als in gnome-terminal, sondern fehlt vollständig.
Martin Vegter
1
Was meinst du damit, dass der graue Hintergrund fehlt? Es ist wahrscheinlich da, aber nicht sichtbar, weil es die gleiche Farbe wie Ihr Hintergrund hat. Technisch gesehen gibt es in ANSI keine graue Farbe, sondern nur Schwarz oder Weiß. Vielleicht haben Sie Ihre Hintergrundfarbe auf Schwarz eingestellt, und ANSI-Schwarz ist Schwarz zugeordnet, LXTerminalaber Grau gnome-terminal. Ich benutze es nicht LXTerminal, aber ich wette, wenn Sie in den Einstellungen nachsehen und die 'schwarzen' Farben in 'grau' ändern, wird es sichtbar.
Matt
Du liegst absolut richtig. Wenn ich die Hintergrundfarbe von my LXTerminalin etwas anderes als Schwarz ändere , kann ich sehen, dass printf "\n\033[1;31;40m"hello"\033[00m\n\n"Text auf schwarzem Hintergrund gedruckt wird. Was also gnome-terminalals grau LXTerminalinterpretiert wird, wird als schwarz interpretiert. Gibt es eine Möglichkeit grau in angezeigt werden LXTerminal, gleich wie in gnome-terminal?
Martin Vegter
1
Tatsächlich beträgt der Aixterm SGR 90-97 und 100-107. Helle Hintergründe für Fettdruck stammen von anderen Systemen (nicht original für Linux, aber dort verwendet).
Thomas Dickey
5

Das 1Attribut am Anfang von 1;31;40aktiviert den "Fett" -Modus (auch bekannt als "Hell"), aber einige Terminals wenden dies nur auf die Vordergrundfarbe an. Ich habe keine Ahnung aus welchem ​​Grund (und das Ändern der Variablen $ TERM macht keinen Unterschied), da sie 16 Farben im Vordergrund unterstützen. 1 0 (von 40: 4 = Hintergrund, 0 = Farbe) ist tatsächlich schwarz, aber "helles Schwarz" ist grau. Hier sind zwei Lösungen:

  • Farbe 7 (weiß) wird sich wahrscheinlich als grau herausstellen, nicht als weiß (für echtes Weiß benötigen Sie "helles 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 beginnen Sie mit gnome-terminal(ich glaube, das ist der Befehlsname). Dann müssen Sie alle Starter konfigurieren, um diese anstelle des lx-Terminals zu verwenden.

1 Hier ist meine Vermutung: Beachten Sie, dass die Einstellung Fett die Helligkeit der Vordergrundfarbe anwendet und eine Fettbetonung hinzufügt. Daher können Sie keine helle Vordergrundfarbe verwenden, ohne auch Fettdruck anzuwenden. Vermutlich damals, als monochrome Terminals üblich waren, einfach nur fett hervorgehoben, z. B.: \\033[1mBlah blah\\033[0mWar üblich - und tatsächlich funktioniert dies immer noch, aber es macht auch Ihre Vordergrundfarbe hell. Wenn wir es für unerwünscht halten, dass dies auch den Hintergrund aufhellt (weil es nur fett sein soll), würden wir sicherstellen, dass die Implementierung dies nicht tut. Naja.

Goldlöckchen
quelle
Ich habe installiert gnome-terminalund die Farben werden korrekt angezeigt. Bedeutet das, dass dieses Problem spezifisch ist LXTerminal? Gibt es eine Möglichkeit, dies zu beheben? Ich würde es vorziehen LXTerminal, wenn dieses Problem gelöst werden könnte.
Martin Vegter
2
Das Problem ist nicht spezifisch für LXTerminal. Tatsächlich ist es gnome-terminalvielleicht das einzige Terminal, das das tut, was Sie wollen. Ich bin seit ~ 15 Jahren ein Linux-Benutzer und habe aufgrund der Eingabeaufforderung frühzeitig etwas über ANSI-Sequenzen gelernt. es war schon immer so. Ich könnte in der Lage sein, entscheidend herauszufinden, warum, indem ich die offiziellen ANSI-Spezifikationen recherchiere und / oder durch die Quelle blättere, aber das würde einen sehr unbestimmten Zeitraum erfordern;) Ich habe nach dem Surfen im Internet nichts Hoffnungsvolles gefunden, also ist deins ein Gute Frage, aber jemand, der es bereits weiß, könnte am nächsten Tag oder so kommen ...
Goldlöckchen
1

Hier ist ein Trick, den Sie mit einigen Terminalemulatoren verwenden können. Sie erhalten helle Hintergrundfarben, indem Sie mit dem Umkehrvideoattribut (7) eine helle Vordergrundfarbe auswählen und diese dann mit der Hintergrundfarbe austauschen.

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

Der Haken ist, dass, obwohl Sie jetzt 16 Hintergrundfarben haben können, die Beschränkung von 8 Farben jetzt stattdessen für den Vordergrund / Text gilt. Und um die Sache noch weiter zu verwirren, müssen Sie die Textfarbe mithilfe der Attributcodes für Hintergrundfarben festlegen, während das Reverse-Video-Attribut aktiv ist!

Malvineous
quelle
1
Die umgekehrte Methode ist die einzige Methode, die in jedem von mir getesteten Terminal funktioniert: win xp, win7 (mintty, cmd cygwin, conemu cygwin), debian (xfce, xterm)echo -e "\e[1;33;40;7m TEST2 \e[0m"
Badr Elmers
0

Mit 47=background whiteanstelle von erhalten 40=background blackSie 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)

Fettschwarz führt standardmäßig zu Dunkelgrau. Normales Weiß ist eigentlich grau, weil kräftiges Weiß weiß ist.


Diese Schleife druckt zwei Spalten mit allen Farb-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 laufe ich nur von 30 auf 47)


Akzeptiert A. erwähnt acht Farben und fehlende Standards.

Die sechs Farben 31-36 (rot bis cyan) sind gut definiert. Schwarz (30) und Weiß (37) auch, aber ihre kühnen Varianten weniger, insbesondere als Hintergrund (40 und 47).


Ich merke nur: 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 stoppte das Skript bei 46, weil ich keine unlesbaren Varianten wollte)

An beiden Stellen passt es sich bei Auswahl der Maus geschickt an und bleibt beim Umkehren lesbar.

Rastafile
quelle