Quel type de terminal est-ce que j'utilise?

51

J'ai testé cela avec Ubuntu 12.04 et Debian 7. Quand je le fais

echo $TERM

Je reçois

xterm

Mais si j'utilise le menu déroulant "aide"> "à propos de", il est indiqué gnome terminal 3.4.1.1.

Est-ce que cela signifie que j'utilise seulement gnome-terminal? Ou juste xterm? Ou bien gnome-terminal est-il une extension de xterm? Je suis confus.

Mulllhausen
la source

Réponses:

49

À quoi ça sert $TERM?

La $TERMvariable est utilisée par les applications pour tirer parti des fonctionnalités de ce terminal.

Par exemple, si un programme souhaite afficher du texte en couleur, il doit d'abord savoir si le terminal que vous utilisez prend en charge le texte en couleur, puis, le cas échéant, comment le faire en couleur.

La façon dont cela fonctionne est que le système conserve une bibliothèque de terminaux connus et de leurs capacités. Sur la plupart des systèmes, cela se trouve /usr/share/terminfo(il y a aussi termcap, mais son héritage n’est plus très utilisé).

Alors disons que vous avez un programme qui veut afficher du texte rouge. Il appelle essentiellement la bibliothèque terminfo qui dit " donnez-moi la séquence d'octets que je dois envoyer pour le texte rouge pour le terminal xterm ". Ensuite, il suffit de prendre ces octets et de les imprimer.
Vous pouvez essayer cela vous-même en faisant tput setf 4; echo hi. Cela obtiendra la setfcapacité terminfo et lui passera un paramètre 4, qui est la couleur que vous voulez.


Pourquoi gnome terminal repose sur lui-même:

Maintenant, disons que vous avez un nouvel émulateur de terminal brillant qui vient d'être publié, et que la bibliothèque terminfo du système n'a pas encore de définition pour celui-ci. Lorsque votre application va rechercher comment faire quelque chose, elle échouera car le terminal n'est pas connu.

Votre terminal parvient à contourner ce problème en mentant à propos de qui il s'agit. Donc, votre terminal gnome dit " je suis xterm ".

Xterm est un terminal très basique qui existe depuis l’aube de X11, et la plupart des émulateurs de terminaux supportent donc ce qu’il supporte. Donc, en disant que le terminal gnome est un xterm, il est plus probable qu’il ait une définition dans la bibliothèque terminfo.

L'inconvénient de mentir au sujet de votre type de terminal est que le terminal peut en réalité supporter beaucoup plus que xterm (par exemple, de nombreux nouveaux terminaux supportent 256 couleurs, alors que les anciens terminaux n'en supportaient que 16). Donc, vous avez un compromis, obtenez plus de fonctionnalités ou avez plus de compatibilité. La plupart des terminaux opteront pour davantage de compatibilité et choisiront donc de se faire connaître xterm.

Si vous souhaitez éviter cela, de nombreux terminaux vous proposeront un moyen de configurer le comportement. Mais vous pouvez aussi simplement faire export TERM=gnome-terminal.

Patrick
la source
4
Recommander quelqu'un d'exporter $ TERM ressemble vraiment à frotter le sel dans une plaie ouverte ...
jasonwryan
1
Ouais. Je devine que les développeurs de gauche gnome-terminal $TERMjeu à xtermpour une bonne raison
mulllhausen
4
@mulllhausen Cette raison est bien expliquée dans ma réponse ...
Patrick
27

La TERMvariable d'environnement indique le type de terminal , pas l' application de terminal . TERMa un objectif spécifique: il indique aux applications fonctionnant dans ce terminal comment interagir avec le terminal.

Les applications interagissent avec les terminaux en écrivant des séquences d'échappement - séquences de caractères qui incluent des caractères non imprimables et ont des effets tels que déplacer le curseur, effacer une partie de l'écran, changer la couleur actuelle, etc. Auparavant, les marques de terminaux physiques avaient des ensembles de séquences d'échappement. Par conséquent, le système d'exploitation maintient une base de données des types de terminaux et de leurs caractéristiques. La base de données traditionnelle est termcap («TERMinal CAPabilities»); de nombreux systèmes et applications modernes sont passés à terminfo . Les deux bases de données sont indexées par le nom du type de terminal et les applications les interrogent en utilisant le nom du type de terminal à partir des TERMvariables d'environnement.

De nos jours, la plupart des terminaux utilisent un ensemble standard de séquences d'échappement avec quelques ensembles d'extensions courants, vous ne verrez donc pas beaucoup de valeurs différentes de TERM. La plupart des émulateurs de terminaux à interface graphique sont compatibles avec xterm , le terminal X traditionnel (qui est toujours utilisé et maintenu).

Les émulateurs de terminal qui diffèrent de xterm peuvent ajouter leur propre entrée à la base de données de terminal sous leur propre nom. Cependant, cela ne va pas bien avec les obus distants. Un programme qui s'exécute sur la machine A mais qui s'affiche sur la machine B, par exemple parce qu'il a été lancé de B en A via ssh, doit interroger la base de données du terminal sur la machine A. Des méthodes de connexion à distance telles que ssh reportent la TERMvariable d'environnement, mais Cela n'est utile que lorsque la base de données du terminal de B contient également une entrée pour la valeur utilisateur sur A. Par conséquent, de nombreux émulateurs de terminal s'en tiennent, TERM=xtermce qui est à peu près universellement connu.

La différenciation entre les terminaux ne provient pas en grande partie de la manière dont les applications interagissent avec eux, mais bien de la manière dont les terminaux interagissent avec l'utilisateur et s'intègrent dans leur environnement. Par exemple, Gnome Terminal a une bonne apparence sur Gnome et fournit des onglets et autres subtilités. Konsole semble bien sur KDE et fournit des onglets et autres subtilités; urxvt a peu de mémoire requise; Console2 fonctionne sous Windows; screen et tmux fournissent des sessions pouvant être attachées à différents terminaux parents; etc. Étant donné qu'aucune de ces fonctionnalités ne fait la différence pour les applications exécutées dans le terminal, la plupart des émulateurs de terminal utilisent TERM=xterm.

Pour savoir quel terminal un shell l'exécute, regardez le parent du shell:

ps -p$PPID
Gilles, arrête de faire le mal
la source
Courir ps -p$PPIDne semble pas me dire quel terminal je cours. Ou du moins pas d'une manière que je comprends. Avez-vous un exemple de sortie / réponse?
user3731622
@user La sortie est un ensemble de nombres et d'abréviations cryptiques suivis d'une ligne de commande. Dans la plupart des cas, la ligne de commande est celle qui a démarré l'émulateur de terminal dans lequel le shell est en cours d'exécution.
Gilles 'SO- arrête d'être méchant'
12

La variable d'environnement TERM ne signifie pas le terminal que vous utilisez.

Citant gnu.org :

La variable d'environnement TERM contient un identifiant pour les capacités de la fenêtre de texte. Vous pouvez obtenir une liste détaillée de ces fonctionnalités en utilisant la commande> 'infocmp', en utilisant 'man 5 terminfo' comme référence.

Lors de la production de texte avec des directives de couleur intégrées, msgcat examine la variable TERM. De nos jours, les fenêtres de texte prennent en charge au moins 8 couleurs. Toutefois, la fenêtre de texte prend souvent en charge 16 couleurs ou plus, même si la variable TERM est définie sur un identificateur indiquant seulement 8 couleurs prises en charge. Il peut être intéressant de définir la variable TERM sur une valeur différente dans les cas suivants:

xterm est dans la plupart des cas construit avec un support pour 16 couleurs. Il peut également être construit avec un support pour 88 ou 256 couleurs (mais pas les deux). Vous pouvez essayer de définir TERM sur xterm-16color, xterm-88color ou xterm-256color. rxvt

rxvt est souvent construit avec un support pour 16 couleurs. Vous pouvez essayer de définir TERM sur rxvt-16color. konsole

Konsole aussi est souvent construit avec un support pour 16 couleurs. Vous pouvez essayer de définir TERM sur konsole-16color ou xterm-16color.

Après avoir défini TERM, vous pouvez le vérifier en appelant 'msgcat --color = test' et en vérifiant si le résultat obtenu a l'aspect d'une palette de couleurs raisonnable. La variable d'environnement TERM contient un identifiant pour les capacités de la fenêtre de texte. Vous pouvez obtenir une liste détaillée de ces fonctionnalités en utilisant la commande 'infocmp', en utilisant 'man 5 terminfo' comme référence.

mavillan
la source