it-swarm.com.de

Wo wird die Standardeinstellung für die Umgebungsvariable TERM festgelegt?

Wenn ich ein Terminalfenster mit dem GNOME-Terminalemulator in der Desktop-GUI öffne, wird für die Shell TERM-Umgebungsvariable standardmäßig der Wert xterm verwendet.

Wenn ich benutze CTL+ALT+F1 um zu einem Konsolen-TTY-Fenster zu wechseln und echo $TERM Der Wert wird auf linux gesetzt.

Meine Motivation zu fragen ist, dass in meinem ~/.bashrc Datei Eine Variable wird verwendet, um zu bestimmen, ob eine Farb-Shell bereitgestellt wird oder nur ein gutes altmodisches 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 tippe

export TERM=xterm-color
source /.bashrc

beide Schalen wechseln in den Farbmodus (etwas, das ich mir in beiden immer gewünscht hätte).

Wo werden bitte die Standardwerte für TERM festgelegt und wo können die Standardeinstellungen am besten geändert werden, wenn dies überhaupt möglich ist? In der Benutzeroberfläche des Terminalemulators befindet sich anscheinend nichts, um den Standard-TERM-Wert auszuwählen oder festzulegen.

Ich habe darüber nachgedacht, nur die Zeile export TERM=xterm-color an die Spitze meines ~/.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 Based).

26
Andy Fusniak

An vielen Orten, je nach

Auf virtuellen Terminals und realen Terminals wird die Umgebungsvariable TERM vom Programm festgelegt, das mit login verkettet ist, und wird bis zur interaktiven Shell vererbt, die ausgeführt wird, sobald man sich angemeldet hat . Wo genau dies geschieht, variiert von System zu System und je nach Art des Terminals.

echte Terminals

Echte, serielle Anschlüsse können je nach dem, was sich am anderen Ende des Kabels befindet, in ihrem Typ variieren. Herkömmlicherweise wird das Programm getty mit einem Argument aufgerufen, das den Terminaltyp angibt, oder das Programm TERM wird aus den Dienstkonfigurationsdaten eines Service-Managers übergeben.

  • Auf van Smoorenburg init Systemen kann man dies in /etc/inittab Einträgen sehen, 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. In /etc/inittab Wird also der Terminaltyp für echte Terminals auf solchen Systemen geändert.
  • Auf systemd-Systemen konnte man dies früher in der Unit-Datei /usr/lib/systemd/system/[email protected] (/lib/systemd/system/[email protected] Auf nicht zusammengeführten Systemen) sehen, in der Gelesen wurde.
    Umgebung = TERM = vt100
    Festlegen der Variablen TERM in der an agetty übergebenen Umgebung.
  • Auf den BSDs nimmt init den Terminaltyp aus dem dritten Feld des Eintrags jedes Terminals in der Datenbank /etc/ttys Und setzt TERM aus dem in der Umgebung, in der es ausgeführt wird getty $ var] _ mit. In /etc/ttys Wird also der Terminaltyp für echte Terminals auf den BSDs geändert.

variabilität von systemd

In der Service Unit-Datei [email protected] Oder den dafür geltenden Drop-In-Dateien kann der Terminaltyp für echte Terminals auf systemd-Systemen geändert werden. Beachten Sie, dass eine solche Änderung für alle Terminal-Anmeldedienste gilt, die diese Serviceeinheitsvorlage verwenden. (Um es nur für einzelne Terminals zu ändern, muss die Vorlage manuell instanziiert oder Drop-Ins hinzugefügt werden, die nur für Instanziierungen gelten.)

systemd hatte während seiner Lebensdauer mindestens vier Mechanismen zum Abrufen des Werts der Umgebungsvariablen TERM. Zum Zeitpunkt des ersten Schreibens dieser Antwort befand sich, wie zu sehen ist, eine Environment=TERM=something - Zeile in den Dateien der Template-Serviceeinheit. Zu anderen Zeiten wurden die Typen linux und vt102 Fest in die Serviceeinheitendateien getty und serial-getty Verdrahtet. In jüngerer Zeit wurde die Umgebungsvariable von Prozess 1 geerbt, der sie auf verschiedene Arten festgelegt hat.

Ab 2020 ist die Art und Weise, wie systemd entscheidet, welcher Terminaltyp in der Umgebungsvariablen TERM eines Dienstes angegeben werden soll, recht komplex und überhaupt nicht dokumentiert. Die Möglichkeit, dies zu ändern, bleibt eine Drop-In-Konfigurationsdatei mit Environment=TERM=something. Aber , von dem der Standardwert stammt , ist ziemlich variabel. Vorbehaltlich einiger recht komplexer Regeln, die die TTYPath= - Einstellungen einzelner Serviceeinheiten betreffen, dies kann einer von drei Werten sein : ein festverdrahtetes linux, ein festverdrahtetes vt220 (Nicht mehr vt102) Oder der Wert der Umgebungsvariablen TERM, die Prozess Nr. 1 geerbt hat, normalerweise vom Kernel/Bootstrap-Loader.

(Ironischerweise existiert der Mechanismus getttyent() immer noch in der Bibliothek GNU C, und systemd hätte den Mechanismus /etc/ttys Wiederverwenden können.)

virtuelle Kernel-Terminals

Wie Sie bereits bemerkt haben, haben virtuelle Kernel-Terminals einen festen Typ. Im Gegensatz zu NetBSD, das den virtuellen Terminaltyp des Kernels im laufenden Betrieb variieren kann, verfügen Linux und die anderen BSDs über einen einzigen festen Terminaltyp, der im integrierten Terminalemulationsprogramm des Kernels implementiert ist. Unter Linux stimmt dieser Typ mit linux aus der terminfo-Datenbank überein. (Die Kernel-Terminal-Emulation von FreeBSD seit Version 9 war teken. Vor Version 9 war es cons25 OpenBSDs ist pccon.)

  • Auf Systemen, die mingetty oder vc-get-tty (Aus dem nosh-Paket) verwenden, "weiß" das Programm, dass es nur mit einem virtuellen Terminal kommunizieren kann, und verdrahtet die "bekannten" virtuellen Terminaltypen, die für geeignet sind das Betriebssystem, für das das Programm kompiliert wurde.
  • Auf systemd-Systemen konnte man dies früher in der Unit-Datei /usr/lib/systemd/system/[email protected] (/lib/systemd/system/[email protected] Auf nicht zusammengeführten Systemen) sehen, die Lautete.
    Umgebung = TERM = Linux
    Festlegen der Variablen TERM in der an agetty übergebenen Umgebung.

Bei virtuellen Kernel-Terminals ändert eins den Terminaltyp nicht . Das Terminalemulatorprogramm im Kernel ändert sich schließlich nicht. Es ist falsch , den Typ zu ändern. Dies wird insbesondere die CSI-Sequenzerkennung des Cursors/Bearbeitungsschlüssels beeinträchtigen. Die vom Linux-Kernel-Terminalemulator gesendeten CSI-Sequenzen linux unterscheiden sich von den CSI-Sequenzen xterm oder vt100, Die von GUI-Terminalemulatorprogrammen im DEC VT-Modus gesendet werden. (Tatsächlich sind sie sehr eigenwillig und nicht standardisiert und unterscheiden sich sowohl von allen mir bekannten realen Terminals als auch von so ziemlich allen anderen Software-Terminal-Emulatoren außer dem in Linux integrierten.)

GUI-Terminalemulatoren

Ihr GUI-Terminalemulator ist eines von vielen Programmen, von SSH-Dæmon bis screen, die Pseudo-Terminals verwenden. Was der Terminaltyp ist, hängt davon ab, welches Terminalemulatorprogramm auf der Masterseite des Pseudo-Terminals ausgeführt wird und wie es konfiguriert ist. Die meisten GUI-Terminalemulatoren starten das Programm auf der Slave-Seite mit einer TERM -Variablen, deren Wert mit ihrer Terminalemulation auf der Master-Seite übereinstimmt. Programme wie der SSH-Server versuchen, den Terminaltyp auf der Client-Seite der Verbindung zu "durchlaufen". Normalerweise gibt es ein Menü oder eine Konfigurationsoption, um zwischen Terminalemulationen zu wählen.

Die packende Hand

Der richtige Weg, um die Farbfähigkeit zu erkennen, besteht darin, nicht eine Liste von Terminaltypen in Ihrem Skript fest zu verdrahten. Es gibt sehr viele Terminaltypen, die Farbe unterstützen.

Der richtige Weg ist zu sehen, was termcap/terminfo über Ihren Terminaltyp sagt.

color = 0 
 wenn tput Co>/dev/null 2> & 1 
, dann 
 teste "` tput Co` "-gt 2 && color = 1 
 Elif Eingabefarben>/dev/null 2> & 1 
 dann 
 Test "Eingabefarben" -gt 2 && Farbe = 1 
 fi

Weiterführende Literatur

  • Jonathan de Boyne Pollard (2018). TERM . nosh Guide . Software.
19
JdeBP

Unter https://askubuntu.com/a/614714/398785 finden Sie eine ausführliche Antwort darauf, warum ich denke, dass TERM=xterm-color Der falsche Ansatz ist und Ubuntus .bashrc Veraltet ist . Ich empfehle Ihnen, TERM=xterm-256color Zu verwenden (dies ist die Standardeinstellung seit Gnome-Terminal 3.16, aber auch sicher für ältere Gnome-Terminals) und Ihren .bashrc Entsprechend anzupassen.

2
egmont

Für Linux ist in init/main.c diese Umgebung definiert:

static const char *argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
const char *envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };

und dann aufgerufen mit do-execve ():

static int run_init_process(const char *init_filename)
{
    argv_init[0] = init_filename;
    pr_info("Run %s as init process\n", init_filename);
    return do_execve(getname_kernel(init_filename),
        (const char __user *const __user *)argv_init,
        (const char __user *const __user *)envp_init);
}

Dieses pr_info () erscheint als:

]# dmesg |grep 'Run'
[    1.291323] Run /init as init process

Der Standardwert ist also von Anfang an "TERM = Linux".

0
rastafile