Wie kann ich überprüfen, welche Terminaldefinitionen verfügbar sind?

16

Der Großteil der Frage ist im Titel, aber um es ein wenig zu erläutern:

Auf den meisten Linuxen kann ich find /usr/share/terminfo -type f. Aber auf einem Solaris-Computer in der Nähe gibt es dieses Verzeichnis noch nicht einmal.

Ich könnte eine Liste von Terminals durchlaufen und Folgendes tun:

for TERM in xterm xtermc xterm-color xterm-256color screen rxvt
do
    tput cols >/dev/null 2>/dev/null && echo "$TERM available"
done

Aber es ist langsam. Gibt es Optionen, um den Pfad zu ermitteln, der von tputTerminaldefinitionen verwendet wird , und um "find myself" auszuführen?


quelle

Antworten:

9

Unter Solaris 10 können Sie Folgendes tun:

find /usr/share/lib/terminfo -type f -print

Sie sollten in der Lage sein, Folgendes zu tun:

find /usr -type d -name terminfo -print

um herauszufinden, wo sich das Verzeichnis befindet.

Sie können auch lesen, um den genauen Pfad zu finden:

man terminfo
Karlson
quelle
Das ist großartig, aber ich habe ein kleines Problem damit - wie kann ich den Pfad finden, ohne die menschliche Ausgabe zu belasten? Gibt es eine Möglichkeit, es zu tun?
Ich habe die Antwort geändert.
Karlson
10

Das infocmp-Programm auf "jedem" System, das terminfo unterstützt, zeigt den Pfadnamen an, in dem es die Terminalbeschreibung für das aktuelle Terminal findet. Zum Beispiel (AIX in diesem Fall):

$ infocmp vt100
#       Reconstructed via infocmp from file: /usr/share/lib/terminfo/v/vt100
vt100|vt100-am|Digital VT100,
        am, msgr, xenl, xon,
        cols#80, it#8, lines#24, vt#3,
        ...

Für ncurses ist es komplizierter, da Sie mehrere Terminfo-Datenbanken haben können und die Einträge keine einzelnen Dateien sein müssen. Eine einzelne Datenbank und eine Datei pro Eintrag sind aus Gründen der Kompatibilität mit Unix-Systemen die Standardeinstellungen .

Die -DOption für tic und infocmp (hinzugefügt Ende 2011 ) ist eine Möglichkeit, die zusätzlichen Informationen anzuzeigen . Auf meinem Debian7 kann ich zum Beispiel Folgendes sehen:

$ infocmp6 -D
/users/tom/.terminfo
/usr/local/ncurses/share/terminfo
/usr/share/terminfo
/lib/terminfo

Auf meinem FreeBSD 10-Rechner verwende ich Hash-Datenbanken:

$ infocmp -D
/usr/local/ncurses/share/terminfo.db
/usr/local/share/misc/terminfo
/etc/termcap

Alternativ kann das toeProgramm verwendet werden, um einen Bericht aller verfügbaren Terminaleinträge zu erstellen. Mit den Optionen -sund -akönnen Dinge kombiniert werden (wie das conflictProgramm):

--> /users/tom/.terminfo
----> /usr/local/ncurses/share/terminfo
------> /usr/share/terminfo
--------> /lib/terminfo
--*-+---:       9term           Plan9 terminal emulator for X
--*---*-:       Eterm           Eterm with xterm-style color support (X Window System)
--*-*---:       Eterm-256color  Eterm with xterm 256-colors
--*-*---:       Eterm-88color   Eterm with 88 colors
--*-+---:       MtxOrb          Generic Matrix Orbital LCD display
--*-+---:       MtxOrb162       16x2 Matrix Orbital LCD display
--*-+---:       MtxOrb204       20x4 Matrix Orbital LCD display
--*-+---:       NCR260VT300WPP  NCR 2900_260 vt300 wide mode pc+  kybd
--*-+---:       aaa             ann arbor ambassador/30 lines
--*-+---:       aaa+dec         ann arbor ambassador in dec vt100 mode
--*-+---:       aaa+rv          ann arbor ambassador in reverse video
...
Thomas Dickey
quelle
0

Unter Linux können Sie stracesehen, welche Systemaufrufe ein Programm verwendet. Das Folgende listet alle "open (2)" - Systemaufrufe auf und filtert sie durch sed, um hoffentlich die Terminfo-Datei anzuzeigen, die tputzum Übersetzen der Terminfo-Fähigkeit für das aktuelle Terminal verwendet wird.

TERMINFO_FILE=$(strace -e open tput cud1 2>&1 | sed -n -e 's/^.*\(".*terminfo.*"\).*$/\1/p')
echo ${TERMINFO_FILE}

Beachten Sie, dass dieser sed-Ausdruck davon ausgeht, dass Ihre terminfo-Dateien in einem Pfad mit dem Muster "terminfo" gespeichert sind. Wenn Sie das beunruhigen, könnten Sie eine andere Annahme treffen und den letzten "offenen" Systemaufruf auswählen.

TERMINFO_FILE=$(strace -e open tput cud1 2>&1 | grep -e "^open" | tail -n 1 | sed -n -e 's/^.*\(".*"\).*$/\1/p')
echo ${TERMINFO_FILE}

Abschließend können Sie die Liste der Terminalsuchpfade mit infocmp -Doder ausgeben tic -D. Diese listen ihre kompilierten terminfo-Suchpfade auf. Dies sind die gleichen Pfade, die von Flüchen durchsucht werden.

Noah Spurrier
quelle