Wenn ich ein Terminalfenster mit dem GNOME-Terminalemulator in der Desktop-GUI öffne, nimmt die Umgebungsvariable TERM der Shell standardmäßig den Wert xterm
an .
Wenn ich CTL verwende +ALT +F1 um zu einem Konsolen-TTY-Fenster zu wechseln und echo $TERM
der Wert wird auf linux
gesetzt .
Meine Motivation für die Frage ist das in meinem ~/.bashrc
Datei wird eine Variable verwendet, um festzustellen, ob eine Farbhülle bereitgestellt wird oder nur das gute altmodische Monochrom.
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color) color_prompt=yes;;
esac
Sowohl in der Konsolen-Shell als auch in der Gnome Terminal-Emulator-Shell, wenn ich
eingebeexport TERM=xterm-color
source /.bashrc
Beide Shells wechseln in den Farbmodus (was ich gerne immer in beiden haben würde).
Woher kommt der Standard TERM
Werte bitte setzen und wo ist der beste Ort, um ihre Standardwerte zu ändern, wenn dies überhaupt möglich ist? Es scheint nichts in der GUI des Terminalemulators zu geben, um den Standardwert für TERM auszuwählen oder festzulegen.
Ich habe überlegt, einfach die Zeile export TERM=xterm-color
hinzuzufügen an den Anfang meiner ~/.bashrc
Datei, aber mein Bauchgefühl sagt, dass dies nicht die beste Lösung ist, und meine Google-Suche hat mich noch nicht zu einer guten Antwort geführt.
Ich verwende Ubuntu 15.04 Desktop Edition (Debian-basiert).
Akzeptierte Antwort:
An vielen Orten, je nachdem
Auf virtuellen Terminals und realen Terminals wird der TERM
Die Umgebungsvariable wird von dem Programm gesetzt, das mit login
verkettet wird , und wird vollständig an die interaktive Shell vererbt, die ausgeführt wird, sobald man sich angemeldet hat. Wo genau dies geschieht, ist von System zu System und je nach Art des Endgeräts unterschiedlich.
echte Terminals
Reale, serielle Terminals können in ihrem Typ variieren, je nachdem, was sich am anderen Ende des Kabels befindet. Also konventionell das getty
Das Programm wird mit einem Argument aufgerufen, das den Terminaltyp angibt, oder ihm wird der TERM
übergeben Programm aus den Dienstkonfigurationsdaten eines Dienstverwalters.
- Auf van Smoorenburg
init
Systemen kann man dies in/etc/inittab
sehen Einträge, die etwas in der Art von lesenS0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav
Das letzte Argument für
agetty
in dieser Zeilevt100-nav
, ist der für/dev/ttyS0
festgelegte Terminaltyp . Also/etc/inittab
Hier können Sie den Terminaltyp für echte Terminals auf solchen Systemen ändern. - Auf systemd-Systemen konnte man dies früher in
/usr/lib/systemd/system/[email protected]
sehen Unit-Datei (/lib/systemd/system/[email protected]
auf nicht zusammengeführten Systemen), die früher lautetenEnvironment=TERM=vt100
Setzen des
TERM
Variable in der anagetty
übergebenen Umgebung . - Auf den BSDs
init
nimmt den Terminaltyp aus dem dritten Feld des Eintrags jedes Terminals in/etc/ttys
Datenbank und setztTERM
davon in der Umgebung, in der esgetty
ausführt mit. Also/etc/ttys
Hier ändert man den Terminaltyp für echte Terminals auf den BSDs.
variabilität von systemd
Der [email protected]
Service-Unit-Datei oder Drop-In-Dateien, die sich darauf beziehen, ist der Ort, an dem der Terminaltyp für echte Terminals auf systemd-Systemen geändert werden kann. Beachten Sie, dass eine solche Änderung für alle gilt Terminal-Login-Services, die diese Service-Unit-Vorlage verwenden. (Um es nur für einzelne Terminals zu ändern, muss man die Vorlage manuell instanziieren oder Drop-Ins hinzufügen, die nur für Instanziierungen gelten.)
systemd hatte während seiner Lebensdauer mindestens vier Mechanismen, um den Wert von TERM
aufzunehmen Umgebungsvariable. Als diese Antwort zum ersten Mal geschrieben wurde, gab es, wie man sieht, ein Environment=TERM=something
Zeile in den Template-Service-Unit-Dateien. Zu anderen Zeiten die Typen linux
und vt102
wurden in getty
fest verdrahtet und serial-getty
Service-Unit-Dateien bzw. In jüngerer Zeit wurde die Umgebungsvariable von Prozess #1 geerbt, der sie auf verschiedene Weise gesetzt hat.
Ab 2020 entscheidet systemd, welcher Terminaltyp im TERM
eines Dienstes angegeben werden soll Die Umgebungsvariable ist ziemlich komplex und überhaupt nicht dokumentiert. Der Weg, es zu ändern, bleibt eine Drop-in-Konfigurationsdatei mit Environment=TERM=something
. Sondern woher der Standardwert stammt ist recht variabel. Vorbehaltlich einiger ziemlich komplex zu erklärender Regeln, die den TTYPath=
beinhalten Einstellungen einzelner Diensteinheiten, kann es einer von drei Werten sein:ein fest verdrahteter linux
, ein festverdrahteter vt220
(nicht mehr vt102
) oder der Wert von TERM
Umgebungsvariable, die Prozess #1 geerbt hat, normalerweise vom Kernel/Bootstrap-Loader.
(Ironischerweise ist das getttyent()
Mechanismus existiert immer noch in der GNU C-Bibliothek, und systemd hätte /etc/ttys
wiederverwenden können Mechanismus.)
virtuelle Terminals des Kernels
Virtuelle Kernel-Terminals haben, wie Sie bemerkt haben, einen festen Typ. Im Gegensatz zu NetBSD, das den virtuellen Terminaltyp des Kernels spontan ändern kann, haben Linux und die anderen BSDs einen einzigen festen Terminaltyp, der im integrierten Terminalemulationsprogramm des Kernels implementiert ist. Unter Linux entspricht dieser Typ linux
aus der terminfo-Datenbank. (Die Kernel-Terminal-Emulation von FreeBSD ist seit Version 9 teken
. Vor Version 9 war es cons25
OpenBSDs ist pccon
.)
- Auf Systemen, die
mingetty
verwenden odervc-get-tty
(aus dem nosh-Paket) „weiß“ das Programm, dass es nur mit einem virtuellen Terminal kommunizieren kann, und sie verdrahten die „bekannten“ virtuellen Terminaltypen, die dem Betriebssystem entsprechen, für das das Programm kompiliert wurde. - Auf systemd-Systemen konnte man dies früher in
/usr/lib/systemd/system/[email protected]
sehen Unit-Datei (/lib/systemd/system/[email protected]
auf nicht zusammengeführten Systemen), die lautenEnvironment=TERM=linux
Setzen des
TERM
Variable in der anagetty
übergebenen Umgebung .
Für virtuelle Kernel-Terminals tut man das nicht Ändern Sie den Terminaltyp. Das Terminal-Emulator-Programm im Kernel ändert sich schließlich nicht. Es ist falsch den Typ zu ändern. Dies wird insbesondere die CSI-Sequenzerkennung der Cursor-/Bearbeitungstasten vermasseln. Das linux
Vom Terminalemulator des Linux-Kernels gesendete CSI-Sequenzen unterscheiden sich von xterm
oder vt100
CSI-Sequenzen, die von GUI-Terminalemulatorprogrammen im DEC VT-Modus gesendet werden. (Tatsächlich sind sie höchst eigenwillig und nicht standardisiert und unterscheiden sich sowohl von allen realen Terminals, die ich kenne, als auch von so ziemlich allen anderen Software-Terminalemulatoren außer dem in Linux eingebauten.)
GUI-Terminal-Emulatoren
Ihr GUI-Terminalemulator ist eines von vielen Programmen, vom SSH-Dæmon bis zum screen
, das Pseudo-Terminals verwendet. Was der Terminaltyp ist, hängt davon ab, welches Terminalemulatorprogramm auf der Masterseite des Pseudoterminals läuft und wie es konfiguriert ist. Die meisten GUI-Terminalemulatoren starten das Programm auf der Slave-Seite mit einem TERM
Variable, deren Wert mit ihrer Terminalemulation auf der Masterseite übereinstimmt. Programme wie der SSH-Server versuchen, den Terminaltyp, der sich auf der Client-Seite der Verbindung befindet, „durchzuleiten“. Normalerweise gibt es einige Menü- oder Konfigurationsoptionen zur Auswahl unter den Terminalemulationen.
Die Greifhand
Der richtige Weg, um die Farbfähigkeit zu erkennen, ist nicht um eine Liste von Terminaltypen in Ihrem Skript fest zu verdrahten. Es gibt sehr viele Terminaltypen, die Farbe unterstützen.
Der richtige Weg ist, sich anzusehen, was termcap/termininfo über Ihren Terminaltyp aussagt.
colour=0 if tput Co > /dev/null 2>&1 then test "`tput Co`" -gt 2 && colour=1 elif tput colors > /dev/null 2>&1 then test "`tput colors`" -gt 2 && colour=1 fi
Weiterführende Literatur
- Jonathan de Boyne Pollard (2018).
TERM
. Nosh-Leitfaden . Software.