Comment puis-je vérifier quelles définitions de terminal sont disponibles?

16

La majeure partie de la question est dans le titre, mais pour élaborer un peu:

Sur la plupart des Linux, je peux find /usr/share/terminfo -type f. Mais sur la machine Solaris que j'ai à proximité - ce répertoire n'existe même pas.

Je pourrais parcourir une liste de terminaux et faire quelque chose comme:

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

Mais c'est lent. Y a-t-il des options pour découvrir le chemin utilisé par les tputdéfinitions de terminal et exécuter moi-même "trouver"?


la source

Réponses:

9

Sous Solaris 10, vous pouvez faire:

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

Vous devriez pouvoir faire quelque chose comme:

find /usr -type d -name terminfo -print

pour trouver l'emplacement du répertoire.

Vous pouvez également lire pour trouver le chemin exact:

man terminfo
Karlson
la source
C'est génial, mais j'ai un petit problème avec lui - comment puis-je trouver le chemin, sans saluer la sortie de l'homme? Y a-t-il un moyen de le faire?
J'ai modifié la réponse.
Karlson
10

Le programme infocmp sur "n'importe quel" système supportant terminfo montre le chemin d'accès où il trouve la description du terminal pour le terminal actuel. Par exemple (AIX dans ce cas):

$ 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,
        ...

Pour ncurses, c'est plus compliqué, car vous pouvez avoir plusieurs bases de données terminfo, et les entrées n'ont pas besoin d'être des fichiers individuels. Une seule base de données et un fichier par entrée est la valeur par défaut , pour la compatibilité avec les systèmes Unix.

L' -Doption pour tic et infocmp (ajoutée fin 2011 ) est un moyen d'afficher les informations supplémentaires. Par exemple, sur ma Debian7, je peux voir ceci:

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

Sur ma machine FreeBSD 10, j'utilise des bases de données hachées:

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

Alternativement, on peut utiliser le toeprogramme pour produire un rapport de toutes les entrées de terminal disponibles. L'utilisation des options -set lui -apermet de combiner des choses (comme le conflictprogramme):

--> /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
la source
0

Sous Linux, vous pouvez utiliser stracepour voir quels appels système un programme utilise. Ce qui suit répertorie tous les appels système "open (2)" et les filtre sedpour afficher, espérons-le, le fichier terminfo utilisé par tputpour traduire la capacité terminfo pour le terminal actuel.

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

Notez que cette expression sed suppose que vos fichiers terminfo sont stockés dans un chemin contenant le modèle "terminfo". Si cela vous inquiète, vous pouvez utiliser une hypothèse différente et choisir le dernier appel système "ouvert".

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

Enfin, vous pouvez simplement vider la liste des chemins de recherche terminfo en utilisant infocmp -Dou tic -D. Ceux-ci répertorieront leurs chemins de recherche terminfo compilés. Ce sont les mêmes chemins parcourus par les malédictions.

Noah Spurrier
la source