Wie und wo wird $ TERM interpretiert?

8

Ich frage mich, wie etwas Terminal-Magie intern funktioniert.

Beim Herumspielen mit Docker-Containern wurde die Umgebungsvariable $TERMnicht festgelegt. Dies führte dazu, dass seltsam aussehende Konsolenanwendungen wie vim und tmux, aber auch STRG + 1 (klarer Bildschirm) ignoriert wurden.

Ich bin mir ziemlich sicher, dass alle Funktionen wie teilweise Bildschirmaktualisierungen, Farben, Befehle wie das Zurücksetzen des Bildschirms usw. mithilfe von Escape-Codes realisiert werden, oder?

Wo also wird diese Variable interpretiert und ermöglicht beispielsweise das Zurücksetzen meines Terminalbildschirms mit STRG + l, wenn ich dort den richtigen Wert einstelle? Wer prüft zum Beispiel, welche Farben unterstützt werden (xterm vs xterm-256color)? Die Muschel? Die Anwendung oder eine Bibliothek wie ncurses? Und wo sind die möglichen Werte / Klemmentypen definiert?

Muffel
quelle

Antworten:

7

$TERMwird vom terminfo-System gelesen und interpretiert. terminfo bezieht sich auch auf die Datenbank mit Terminalbeschreibungen, die Sie auf den meisten Systemen in finden /usr/share/terminfo. $TERMmuss mit einem der Einträge in dieser Datenbank übereinstimmen. Es gab auch eine ältere Bibliothek namens termcap, die weniger Funktionen hatte, aber terminfo hat sie ersetzt. In modernen Systemen ist terminfo Teil der ncurses-Bibliothek.

Anwendungen rufen normalerweise entweder Terminalfunktionen direkt mithilfe von Bibliotheksfunktionen ab, tigetstr()oder sie verwenden Fluchschnittstellen höherer Ebene, um das Layout des Bildschirms zu verwalten. In $TERMbeiden Fällen wird die terminfo-Datenbank konsultiert.

Celada
quelle
4

Die TERMVariable wird von jeder Anwendung über Systembibliotheken interpretiert. Sein Wert ist ein Name, der in einer Datenbank nachgeschlagen wird. Abhängig von der Unix-Variante und ihrem Alter kann die Datenbank entweder termcap (traditionell, heutzutage nicht viel verwendet) oder terminfo (modern, da sie als Verbesserung von termcap gedacht war und heutzutage von den meisten Systemen verwendet wird) sein.

Sowohl die termcap- als auch die terminfo-Datenbank verknüpfen Fähigkeitsnamen mit Werten. Funktionen sind entweder Beschreibungen der Funktionen des Terminals (Anzahl der Zeilen, Fähigkeit zum Unterstreichen usw.) oder Zeichenfolgen, die mit dem Terminal ausgetauscht werden können (Escape-Sequenzen zum Formatieren von Text, Bewegen des Cursors usw.) und in der anderen Richtungs-Escape-Sequenzen, die über Funktionstasten gesendet werden). Sie können sich ansehen man 5 termcapund man 5 terminfosehen, welche Funktionen auf Ihrem System bekannt sind.

Wenn Sie beispielsweise Ctrl+ drücken L, um den Bildschirm neu zu zeichnen, werden die Funktionen in der Terminaldatenbank gelesen, um herauszufinden, welche Escape-Sequenzen zum Bewegen des Cursors verwendet werden müssen. Wenn dies TERMnicht oder falsch eingestellt ist, kann der Bildschirm den Cursor nicht bewegen.

Mit dem tputBefehl können Sie Einträge in der terminfo-Datenbank abrufen. Druckt beispielsweise tput linesdie Anzahl der Zeilen auf dem Terminal aus. tput clearlöscht den Bildschirm (weil seine Ausgabe auf dem Terminal gedruckt wird); Um zu sehen, wie die entsprechende Escape-Sequenz lautet, drucken Sie sie in lesbarer Form aus, z tput clear | cat -v.

Die Anzahl der Farben hat eine lange Geschichte, die dazu führt, dass es von Rechts wegen nicht so funktioniert, wie es sollte: Terminalemulatoren neigen dazu, ihre Anzahl von Farben zu unterschätzen, um zu vermeiden, dass einige Anwendungen beschädigt werden. Weitere Informationen hierzu finden Sie unter Unterstützung von tmux, TERM und 256 Farben , insbesondere im Zusammenhang mit tmux. Der Unterschied zwischen xterm-256colorsund xtermbesteht darin, dass der erstere 256 Farben in terminfo meldet, während der letztere die traditionelle 8 meldet.

Gilles 'SO - hör auf böse zu sein'
quelle
2

TERMDurch Konvention bezeichnet eine Klemme Beschreibung. Ursprünglich nannte dies einen Abschnitt einer Termcap -Textdatei (ab Ende der 1970er Jahre). Mitte der 1980er Jahre wurde terminfo als kompilierte (binäre) Datei eingeführt, die beim Abrufen der Terminalbeschreibung Zeit sparte. Während beide für alle Unix-ähnlichen Plattformen verfügbar sind, wird termcap heutzutage nur noch selten als Emulation mit terminfo verwendet.

Für beide Datenformate extrahieren Anwendungen normalerweise Daten aus der Terminaldatenbank mit wiederverwendbaren Programmierbibliotheken. Die terminfo-Programmierbibliothek ist normalerweise Teil der übergeordneten Curses-Bibliothek, obwohl sie (z. B. optional wie in ncurses) als separate Bibliotheksdatei bereitgestellt werden kann. Unabhängig davon, ob die Terminfo-Bibliothek separat bereitgestellt wird oder nicht, wird sie in diesen Fällen als Teil der Curses-Bibliothek betrachtet. (Es gibt auch einige andere übergeordnete Bibliotheken wie Slang).

Der Terminaldatenbankeintrag für jedes Terminal enthält Eigenschaften, die als Funktionen bezeichnet werden . Sie teilen der Curses-Bibliothek (oder Anwendungen, die termcap / terminfo direkt verwenden) mit, wie nützliche Vorgänge wie das Löschen des Bildschirms ausgeführt werden sollen. Für die meisten Terminals ist dies eine Escape-Sequenz. Einige Terminals unterstützen zu diesem Zweck möglicherweise keine Escape-Sequenz. Es gibt andere Funktionen, die von der Curses-Bibliothek kombiniert werden können, um den Bildschirm zu löschen (z. B. das Löschen jeder Zeile). Nicht alle Funktionen sind Escape-Sequenzen. Es gibt boolean und Anzahl von Fähigkeiten wie auch beispielsweise zu sagen , ob ein Merkmal unterstützt wird, und wie groß etwas ist (beispielsweise Bildschirmgröße).

Jede Anwendung, die termcap / terminfo verwendet, verwendet die entsprechende Bibliothek, um die Terminalbeschreibung abzurufen und Vorgänge wie das Einsetzen von Parametern in bestimmte Funktionen auszuführen. Beispielsweise bieten die meisten Terminals die Möglichkeit, den Cursor um eine bestimmte Anzahl von Spalten oder Zeilen von seiner aktuellen Position zu bewegen. Die tparm(oder tiparm) Funktionen ersetzen die Zahl durch die Fähigkeit, die tatsächliche Escape-Sequenz zu erhalten.

Die Curses-Bibliothek verfügt über Befehlszeilenanwendungen, die die Terminaldatenbank verwalten ( tic , infocmp ), und einige, die in Shell-Skripten zum Abfragen der Terminaldatenbank oder zum Ausführen von Operationen auf niedriger Ebene mit Terminalfunktionen ( tput , tset / reset ) verwendet werden.

Es gibt unkonventionelle Anwendungen, die TERMohne Verwendung der Terminaldatenbank verwendet werden. Die meisten von ihnen codieren einfach ihr Verhalten fest (wie GNU grep, groff und die textuellen Webbrowser links / links2 / elinks), während einige über eine eigene Terminaldatenbank verfügen (z. B. GNU ls), jedoch andere Regeln und verwenden Verhalten.

Zurück zu den Fragen:

  • Wo wird diese Variable interpretiert und ermöglicht beispielsweise das Zurücksetzen meines Terminalbildschirms mit STRG + l, wenn ich dort den richtigen Wert einstelle?

    Die Anwendung und die zugrunde liegenden Bibliotheken interpretieren diesen Wert. Für controlL, die in der Readline - Bibliothek für bash erfolgen (was nutzt eine termcap Programming Interface) können.

  • Wer prüft zum Beispiel, welche Farben unterstützt werden (xterm vs xterm-256color)?

    Die Terminaldatenbank speichert die Anzahl der Farben als Funktion sowie Funktionen zum Festlegen der Vordergrund- und Hintergrundfarben und zum Zurücksetzen von Farben. Einige Anwendungen kombinieren diese Funktionen mit anderen Informationen (z. B. der Behauptung eines Entwicklers, dass dies xterm"wirklich" ist xterm-256color).

  • Die Muschel?

    Die meisten Shells verwenden eine Termcap-Programmierschnittstelle, um die Terminalinformationen zu erhalten. Es handelt sich jedoch um Anwendungen, die ihr eigenes Verhalten haben (nicht unbedingt dasselbe wie Flüche).

  • Die Anwendung oder eine Bibliothek wie ncurses?

    (siehe oben: Muscheln sind eine bestimmte Art der Anwendung)

  • Und wo sind die möglichen Werte / Klemmentypen definiert?

    Normalerweise befindet sich dies in einer Terminaldatenbank, die von Anwendungen gemeinsam genutzt wird, die Flüche oder Slang-Bibliotheken verwenden. Einige Anwendungen sind fest codiert oder verwenden eine private Datenbank.

Weiterführende Literatur:

Thomas Dickey
quelle