Welchen Terminaltyp verwende ich?


51

Ich habe dies sowohl mit Ubuntu 12.04 als auch mit Debian 7 getestet

echo $TERM

Ich bekomme

xterm

Aber wenn ich das Dropdown-Menü "Hilfe"> "Über" benutze, heißt es gnome terminal 3.4.1.1.

Bedeutet das, dass ich nur ein Gnome-Terminal benutze? Oder nur xterm? Oder ist gnome-terminal eine Erweiterung von xterm? Ich bin verwirrt.

Antworten:


49

Wofür ist das $TERM?

Die $TERMVariable wird von Anwendungen verwendet, um die Funktionen dieses Terminals zu nutzen.

Wenn ein Programm beispielsweise farbigen Text anzeigen möchte, muss es zuerst herausfinden, ob das von Ihnen verwendete Terminal farbigen Text unterstützt, und wenn ja, wie farbiger Text angezeigt werden soll.

Auf diese Weise verwaltet das System eine Bibliothek bekannter Terminals und ihrer Funktionen. Auf den meisten Systemen ist dies /usr/share/terminfoder Fall (es gibt auch Termcap, aber es wird nicht mehr viel verwendet).

Nehmen wir also an, Sie haben ein Programm, das roten Text anzeigen möchte. Es ruft im Grunde genommen die terminfo-Bibliothek auf, in der steht " Gib mir die Folge von Bytes, die ich für roten Text für das xterm-Terminal senden muss ". Dann nimmt es nur diese Bytes und druckt sie aus.
Sie können dies selbst versuchen, indem Sie dies tun tput setf 4; echo hi. Dadurch wird die setfterminfo-Fähigkeit erhalten und es wird ein Parameter übergeben 4, bei dem es sich um die gewünschte Farbe handelt.


Warum gnome terminal über sich selbst lügt:

Nehmen wir nun an, Sie haben einen glänzenden neuen Terminal-Emulator, der gerade veröffentlicht wurde, und die Terminfo-Bibliothek des Systems hat noch keine Definition dafür. Wenn Ihre Anwendung nachschaut, wie etwas zu tun ist, schlägt dies fehl, da das Terminal nicht bekannt ist.

Die Art und Weise, wie Ihr Terminal dies umgeht, besteht darin, zu lügen, wer es ist. Ihr Gnomenterminal sagt also " I'm xterm ".

Xterm ist ein sehr einfaches Terminal, das es seit den Anfängen von X11 gibt, und daher unterstützen die meisten Terminalemulatoren, was es unterstützt. Wenn das Gnome-Terminal sagt, es sei ein xterm, ist es wahrscheinlicher, dass es eine Definition in der terminfo-Bibliothek hat.

Der Nachteil Ihres Terminaltyps ist, dass das Terminal möglicherweise wesentlich mehr unterstützt als xterm (z. B. unterstützen viele neue Terminals 256 Farben, während ältere Terminals nur 16 unterstützen). Sie haben also einen Kompromiss, erhalten mehr Funktionen oder mehr Kompatibilität. Die meisten Terminals werden sich für mehr Kompatibilität entscheiden und sich daher dafür entscheiden, als zu werben xterm.

Wenn Sie dies überschreiben möchten, bieten viele Terminals eine Möglichkeit, das Verhalten zu konfigurieren. Sie können es aber auch einfach tun export TERM=gnome-terminal.


4
Jemandem zu empfehlen, $ TERM zu exportieren, scheint wirklich so, als würde man Salz in eine offene Wunde reiben ...
jasonwryan

1
Ja. Ich vermute , dass die Entwickler von gnome-terminal links $TERMauf xtermeinen guten Grund
mulllhausen

4
@ Mulllhausen Dieser Grund ist gut in meiner Antwort erklärt ...
Patrick

27

Die TERMUmgebungsvariable gibt den Terminaltyp , nicht die Terminalanwendung . TERMhat einen bestimmten Zweck: Er teilt Anwendungen, die in diesem Terminal ausgeführt werden, mit, wie sie mit dem Terminal interagieren sollen.

Anwendungen interagieren mit Terminals, indem sie Escape-Sequenzen schreiben - Sequenzen von Zeichen, die nicht druckbare Zeichen enthalten und Effekte wie das Bewegen des Cursors, das Löschen eines Teils des Bildschirms, das Ändern der aktuellen Farbe usw. aufweisen Sätze von Escape-Sequenzen. Aus diesem Grund verwaltet das Betriebssystem eine Datenbank mit Terminaltypen und ihren Merkmalen. Die traditionelle Datenbank ist termcap ("TERMinal CAPabilities"); Viele moderne Systeme und Anwendungen haben auf terminfo umgestellt . Beide Datenbanken werden nach dem Namen des Terminaltyps indiziert, und Anwendungen fragen sie unter Verwendung des Terminaltypnamens aus den TERMUmgebungsvariablen ab.

Heutzutage verwenden die meisten Terminals einen Standardsatz von Escape-Sequenzen mit ein paar gemeinsamen Sätzen von Erweiterungen, sodass Sie nicht viele verschiedene Werte von sehen TERM. Die meisten GUI-Terminalemulatoren sind mit xterm kompatibel , dem traditionellen X-Terminal (das immer noch verwendet und gewartet wird).

Terminalemulatoren, die sich von xterm unterscheiden, können der Terminaldatenbank unter ihrem eigenen Namen einen eigenen Eintrag hinzufügen. Dies passt jedoch nicht gut zu Remote-Shells. Ein Programm, das auf Computer A ausgeführt wird, aber auf Computer B angezeigt wird, z. B. weil es über ssh von B nach A gestartet wurde, muss die Terminaldatenbank auf Computer A abfragen. Remote-Anmeldemethoden wie ssh übertragen jedoch die TERMUmgebungsvariable Dies ist nur dann hilfreich, wenn die Terminaldatenbank von B auch einen Eintrag für den Wert user auf A enthält. Daher halten sich viele Terminalemulatoren an TERM=xtermdie allgemein bekannten Werte .

Die Unterscheidung zwischen Terminals im Großen und Ganzen beruht nicht auf der Art und Weise, wie Anwendungen mit ihnen interagieren, sondern auf der Art und Weise, wie die Terminals mit dem Benutzer interagieren und in ihre Umgebung passen. Gnome Terminal sieht beispielsweise auf Gnome gut aus und bietet Registerkarten und andere nützliche Funktionen. Konsole sieht unter KDE gut aus und bietet Tabs und andere nützliche Funktionen. urxvt hat einen geringen Speicherbedarf. Console2 läuft unter Windows. screen und tmux bieten Sitzungen, die an verschiedene übergeordnete Terminals angeschlossen werden können. und so weiter. Da sich keine dieser Funktionen auf Anwendungen auswirkt, die im Terminal ausgeführt werden, werden die meisten Terminalemulatoren verwendet TERM=xterm.

Um herauszufinden, auf welchem ​​Terminal eine Shell ausgeführt wird, sehen Sie sich das übergeordnete Terminal der Shell an:

ps -p$PPID

Laufen ps -p$PPIDscheint mir nicht zu sagen, welches Terminal ich laufe. Oder zumindest nicht so, wie ich es verstehe. Haben Sie eine Beispielausgabe / Antwort?
user3731622

@user Die Ausgabe besteht aus einer Reihe von Zahlen und kryptischen Abkürzungen, gefolgt von einer Befehlszeile. In den meisten Fällen ist die Befehlszeile diejenige, die den Terminalemulator gestartet hat, in dem die Shell ausgeführt wird.
Gilles 'SO - hör auf böse zu sein'

12

Die Umgebungsvariable TERM bedeutet nicht, dass Sie ein Terminal verwenden.

Zitiert von gnu.org :

Die Umgebungsvariable TERM enthält eine Kennung für die Funktionen des Textfensters. Eine detaillierte Liste dieser Funktionen erhalten Sie mit dem Befehl> 'infocmp'. Als Referenz dient 'man 5 terminfo'.

Wenn Sie Text mit eingebetteten Farbanweisungen erstellen, betrachtet msgcat die TERM-Variable. Textfenster unterstützen heute in der Regel mindestens 8 Farben. Häufig unterstützt das Textfenster jedoch 16 oder mehr Farben, obwohl die TERM-Variable auf einen Bezeichner festgelegt ist, der nur 8 unterstützte Farben angibt. In folgenden Fällen kann es sinnvoll sein, die TERM-Variable auf einen anderen Wert zu setzen:

xterm wird in den meisten Fällen mit Unterstützung für 16 Farben erstellt. Es kann auch mit Unterstützung für 88 oder 256 Farben (aber nicht beides) erstellt werden. Sie können versuchen, TERM auf xterm-16color, xterm-88color oder xterm-256color festzulegen. rxvt

rxvt wird häufig mit Unterstützung für 16 Farben erstellt. Sie können versuchen, TERM auf rxvt-16color einzustellen. konsole

Auch konsole wird oft mit Unterstützung für 16 Farben gebaut. Sie können versuchen, TERM auf konsole-16color oder xterm-16color einzustellen.

Nachdem Sie TERM festgelegt haben, können Sie es überprüfen, indem Sie 'msgcat --color = test' aufrufen und prüfen, ob die Ausgabe wie eine vernünftige Farbzuordnung aussieht. Die Umgebungsvariable TERM enthält eine Kennung für die Funktionen des Textfensters. Eine detaillierte Liste dieser Funktionen erhalten Sie mit dem Befehl 'infocmp'. Als Referenz dient 'man 5 terminfo'.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.