Comment et où est interprété $ TERM?

9

Je me demande comment fonctionne la magie des terminaux en interne.

Lors de la lecture avec des conteneurs Docker, la variable d'environnement $TERMn'était pas définie. Cela a conduit à des applications de console d'aspect étrange comme vim et tmux, mais aussi à CTRL + l (écran clair) ignoré.

Je suis à peu près sûr que toutes les fonctionnalités telles que les mises à jour partielles de l'écran, les couleurs, les commandes comme la réinitialisation de l'écran, etc. sont réalisées à l'aide de codes d'échappement, non?

Alors, où cette variable est-elle interprétée et permet par exemple de réinitialiser mon écran de terminal à l'aide de CTRL + l si j'y règle la bonne valeur? Qui vérifie par exemple quelles couleurs sont prises en charge (xterm vs xterm-256color)? La coquille? L'application ou une bibliothèque comme ncurses? Et où sont définies les valeurs / types de terminaux possibles?

muffel
la source

Réponses:

8

$TERMest lu et interprété par le système terminfo. terminfo fait également référence à la base de données des descriptions de terminaux que vous pouvez trouver sur la plupart des systèmes /usr/share/terminfo. $TERMdoit correspondre à l'une des entrées de cette base de données. Il y avait aussi une ancienne bibliothèque appelée termcap qui avait moins de capacités, mais terminfo l'a remplacée. Dans les systèmes modernes, terminfo fait partie de la bibliothèque ncurses.

Les applications récupèrent généralement les capacités du terminal directement à l'aide de fonctions de bibliothèque comme tigetstr()ou elles utilisent des interfaces de curseurs de niveau supérieur pour gérer la disposition de l'écran. Dans tous les cas, $TERMla base de données terminfo sera consultée.

Celada
la source
5

La TERMvariable est interprétée par chaque application, via les bibliothèques système. Sa valeur est un nom qui est recherché dans une base de données. Selon la saveur Unix et son âge, la base de données peut être soit termcap (traditionnelle, peu utilisée de nos jours) ou terminfo (moderne, dans la mesure où elle était censée être une amélioration de termcap et utilisée par la plupart des systèmes de nos jours).

Les bases de données termcap et terminfo associent des noms de capacités à des valeurs. Les capacités sont soit des descriptions de ce que le terminal peut faire (nombre de lignes, capacité de souligner, etc.) ou des chaînes qui peuvent être échangées avec le terminal (séquences d'échappement pour formater le texte, déplacer le curseur, etc., et dans l'autre séquences d'échappement de direction envoyées par les touches de fonction). Vous pouvez regarder man 5 termcapet man 5 terminfovoir quelles capacités sont connues sur votre système.

Par exemple, lorsque vous appuyez sur Ctrl+ Lpour redessiner l'écran, il lit les capacités de la base de données du terminal pour savoir quelles séquences d'échappement il doit utiliser pour déplacer le curseur. S'il TERMn'est pas défini ou mal défini, l'écran n'a aucun moyen de savoir comment déplacer le curseur.

Vous pouvez utiliser la tputcommande pour récupérer des entrées dans la base de données terminfo. Par exemple, tput linesimprime le nombre de lignes sur le terminal. tput clearefface l'écran (car sa sortie est imprimée sur le terminal); pour voir quelle est la séquence d'échappement correspondante, imprimez-la sous une forme lisible, par exemple tput clear | cat -v.

Le nombre de couleurs a un peu d'histoire qui le fait ne pas fonctionner comme il se doit: les émulateurs de terminaux ont tendance à sous-déclarer leur nombre de couleurs, pour éviter de casser certaines applications. Voir la prise en charge de tmux, TERM et 256 couleurs pour plus d'informations, en particulier dans le contexte de tmux. La différence entre xterm-256colorset xtermest que le premier rapporte 256 couleurs en terminfo tandis que le dernier rapporte le traditionnel 8.

Gilles 'SO- arrête d'être méchant'
la source
2

TERM, désigne par convention une description de terminal. À l'origine, cela nommait une section d'un fichier texte termcap (à partir de la fin des années 1970). Au milieu des années 80, terminfo a été introduit en tant que fichier compilé (binaire) qui a permis de gagner du temps lors de l'obtention de la description du terminal. Bien que les deux soient disponibles pour toutes les plates-formes de type Unix, termcap est rarement utilisé aujourd'hui, sauf comme une émulation utilisant terminfo.

Pour ces deux formats de données, les applications extraient généralement les données de la base de données du terminal avec des bibliothèques de programmation réutilisables. La bibliothèque de programmation terminfo fait généralement partie de la bibliothèque curses de niveau supérieur, bien qu'elle puisse être fournie (par exemple, comme dans ncurses) en tant que fichier de bibliothèque distinct. Que la bibliothèque terminfo soit fournie séparément ou non, dans ces cas, elle est considérée comme faisant partie de la bibliothèque curses. (Il existe également quelques autres bibliothèques de niveau supérieur telles que l'argot).

L'entrée de base de données de terminal pour chaque terminal contient des propriétés appelées capacités . Ils indiquent à la bibliothèque curses (ou aux applications utilisant directement termcap / terminfo) comment effectuer des opérations utiles telles que nettoyer l'écran. Pour la plupart des terminaux, il s'agit d'une séquence d'échappement. Certains terminaux peuvent ne pas prendre en charge une séquence d'échappement à cet effet; il existe d'autres capacités qui peuvent être combinées par la bibliothèque curses pour effacer l'écran (comme effacer chaque ligne). Toutes les capacités ne sont pas des séquences d'échappement. Il existe également des capacités booléennes et numériques , par exemple pour indiquer si une fonctionnalité est prise en charge et quelle est la taille d'un élément (comme la taille de l'écran).

Chaque application qui utilise termcap / terminfo utilise la bibliothèque correspondante pour récupérer la description du terminal, ainsi que pour effectuer des opérations telles que la substitution de paramètres dans certaines capacités. Par exemple, la plupart des terminaux offrent la possibilité de déplacer le curseur d'un nombre donné de colonnes ou de lignes depuis son emplacement actuel. Les fonctions tparm(ou tiparm) substituent le nombre à la capacité d'obtenir la séquence d'échappement réelle.

La bibliothèque curses possède des applications en ligne de commande qui maintiennent la base de données du terminal ( tic , infocmp ) et certaines qui sont utilisées dans les scripts shell pour interroger la base de données du terminal ou effectuer des opérations de bas niveau avec des capacités de terminal ( tput , tset / reset ).

Il existe des applications non conventionnelles qui utilisent TERMsans utiliser la base de données du terminal. La plupart d'entre eux codent simplement en dur leur comportement (tels que GNU grep, groff et les navigateurs Web textuels links / links2 / elinks), tandis que quelques - uns ont ce qui équivaut à leur propre base de données de terminaux (tels que GNU ls), mais en utilisant différentes règles et comportement.

Retour à la (aux) question (s):

  • Alors, où cette variable est-elle interprétée et permet par exemple de réinitialiser mon écran de terminal à l'aide de CTRL + l si j'y règle la bonne valeur?

    L'application et les bibliothèques sous-jacentes interprètent cette valeur. Pour controlL, cela peut être fait pour bash dans la bibliothèque readline (qui utilise une interface de programmation termcap).

  • Qui vérifie par exemple quelles couleurs sont prises en charge (xterm vs xterm-256color)?

    La base de données du terminal stocke le nombre de couleurs en tant que capacité, ainsi que des capacités pour définir les couleurs de premier plan et d'arrière-plan et réinitialiser les couleurs. Certaines applications combinent ces capacités avec d'autres informations (comme l'affirmation d'un développeur qui xtermest "vraiment" xterm-256color).

  • La coquille?

    La plupart des shells utilisent une interface de programmation termcap pour obtenir les informations du terminal. Cependant, ce sont des applications qui ont leur propre comportement (pas nécessairement le même que les curses).

  • L'application ou une bibliothèque comme ncurses?

    (voir ci-dessus: les coques sont un type d'application particulier)

  • Et où sont définies les valeurs / types de terminaux possibles?

    Habituellement, cela se trouve dans une base de données terminale partagée par des applications utilisant les bibliothèques curses ou argot. Certaines applications sont codées en dur ou utilisent une base de données privée.

Lectures complémentaires:

Thomas Dickey
la source