GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wo wird die Term-Umgebungsvariable Default gesetzt?

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

eingebe
export 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

    lesen
    S0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav

    Das letzte Argument für agetty in dieser Zeile vt100-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

    lauteten
    Environment=TERM=vt100

    Setzen des TERM Variable in der an agetty übergebenen Umgebung .

  • Auf den BSDs init nimmt den Terminaltyp aus dem dritten Feld des Eintrags jedes Terminals in /etc/ttys Datenbank und setzt TERM davon in der Umgebung, in der es getty 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 oder vc-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

    lauten
    Environment=TERM=linux

    Setzen des TERM Variable in der an agetty ü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.

Linux
  1. Wie setze ich eine Umgebungsvariable in der Befehlszeile und lasse sie in Befehlen erscheinen?

  2. Wo wird die Umgebungsvariable $HOME gesetzt?

  3. So stellen Sie das Standard-Gateway ein

  4. Was ist die Umgebungsvariable XDG_VTNR?

  5. Wo ist die Terminalansicht von tty7

So legen Sie die Umgebungsvariable in Windows fest

So legen Sie Umgebungsvariablen in MacOS fest

So legen Sie den Gnome-Standard-Terminalemulator unter Ubuntu 18.04 LTS fest

So setzen Sie die Umgebungsvariable in Bash

Wo wird die PATH-Variable in Ubuntu gesetzt?

Wo speichert Linux Mint die Dateien für Standard-Desktop-Hintergründe?