Où la variable d'environnement TERM par défaut est-elle définie?

26

Lorsque j'ouvre une fenêtre de terminal avec l'émulateur de terminal GNOME dans l'interface graphique du bureau, la variable d'environnement shell TERM prend la valeur par défaut xterm.

Si j'utilise CTL+ ALT+ F1pour basculer vers une fenêtre TTY de la console et que echo $TERMla valeur est définie sur linux.

Ma motivation pour demander est qu'à l'intérieur de mon ~/.bashrcfichier une variable est utilisée pour déterminer si une coque de couleur est fournie ou juste un bon monochrome à l'ancienne.

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

Dans le shell de la console et le shell de l'émulateur Gnome Terminal si je tape

export TERM=xterm-color
source /.bashrc

les deux coques passent en mode couleur (quelque chose que j'aimerais qu'il se passe toujours dans les deux).

Où les TERMvaleurs par défaut sont-elles définies s'il vous plaît et où est le meilleur endroit pour modifier leurs valeurs par défaut, si possible? Il ne semble y avoir rien dans l'interface graphique de l'émulateur de terminal pour sélectionner ou définir la valeur TERM par défaut.

J'ai envisagé d'ajouter simplement la ligne export TERM=xterm-coloren haut de mon ~/.bashrcfichier, mais mon instinct indique que ce n'est pas la meilleure solution et mes recherches sur Google ne m'ont pas encore conduit à une bonne réponse.

J'utilise Ubuntu 15.04 Desktop Edition (basé sur Debian).

Andy Fusniak
la source

Réponses:

17

Dans beaucoup d'endroits, selon

Sur les terminaux virtuels et les terminaux réels, la TERMvariable d'environnement est définie par le programme qui s'enchaîne loginet est héritée tout au long du shell interactif qui s'exécute une fois que l'on s'est connecté. Lorsque cela se produit précisément, cela varie d'un système à l'autre et selon le type de terminal.

Les terminaux réels et série peuvent varier en type, selon ce qui se trouve à l'autre extrémité du fil. Donc, classiquement, le gettyprogramme est invoqué avec un argument qui spécifie le type de terminal, ou reçoit le TERMprogramme à partir des données de configuration de service d'un gestionnaire de services.

  • Sur les initsystèmes van Smoorenburg , on peut le voir dans les /etc/inittabentrées, qui liront quelque chose dans le sens de

    S0: 3: réapparition: / sbin / agetty ttyS0 9600 vt100-nav
    Le dernier argument de agettycette ligne vt100-nav, est le type de terminal défini pour /dev/ttyS0. Il /etc/inittabs'agit donc de savoir où changer le type de terminal pour les terminaux réels sur de tels systèmes.
  • Sur les systèmes systemd, on peut le voir dans le /usr/lib/systemd/system/[email protected]fichier d'unité ( /lib/systemd/system/[email protected]sur les systèmes non fusionnés), qui lit

    Environnement = TERM = vt100
    définition de la TERMvariable dans l'environnement passée à agetty. Ce fichier d'unité de service est l'endroit où changer le type de terminal pour les terminaux réels sur de tels systèmes. Notez qu'il s'applique à tous les terminaux réels qui utilisent ce modèle d'unité de service. (Pour le modifier uniquement pour les terminaux individuels, il faut instancier manuellement le modèle.)
  • Sur les BSD, initprend le type de terminal dans le troisième champ de l'entrée de chaque terminal dans la /etc/ttysbase de données et définit TERMcelui de l'environnement avec lequel il s'exécute getty. C'est donc /etc/ttyslà que l'on change le type de terminal pour les terminaux réels sur les BSD.

Les terminaux virtuels du noyau, comme vous l'avez noté, ont un type fixe. Contrairement à NetBSD, qui peut faire varier le type de terminal virtuel du noyau à la volée, Linux et les autres BSD ont un seul type de terminal fixe implémenté dans le programme d'émulation de terminal intégré du noyau. Sous Linux, ce type correspond linuxà la base de données terminfo. (L'émulation de terminal noyau de FreeBSD est un xtermsous-ensemble limité depuis la version 9.)

  • Sur les systèmes utilisant mingettyou vc-get-tty(à partir du package nosh) le programme "sait" qu'il ne peut parler qu'à un terminal virtuel, et ils câblent les types de terminaux virtuels "connus" appropriés au système d'exploitation pour lequel le programme a été compilé.
  • Sur les systèmes systemd, on peut le voir dans le /usr/lib/systemd/system/[email protected]fichier d'unité ( /lib/systemd/system/[email protected]sur les systèmes non fusionnés), qui lit

    Environnement = TERM = linux
    définition de la TERMvariable dans l'environnement passée à agetty.

Pour les terminaux virtuels du noyau, on ne change pas le type de terminal. Le programme d'émulation de terminal dans le noyau ne change pas, après tout. Il est incorrect de modifier le type. En particulier, cela vissera la reconnaissance de séquence CSI du curseur / touche d'édition. Les linuxséquences CSI envoyées par l'émulateur de terminal du noyau Linux sont différentes des séquences CSI xtermou vt100envoyées par les programmes d'émulation de terminal GUI en mode DEC VT.

Votre émulateur de terminal GUI est l'un des nombreux programmes, du démon SSH à screen, qui utilise des pseudo-terminaux. Le type de terminal dépend du programme d'émulation de terminal qui s'exécute du côté maître du pseudo-terminal et de sa configuration. La plupart des émulateurs de terminaux GUI démarrent le programme côté esclave avec une TERMvariable dont la valeur correspond à leur émulation de terminal côté maître. Des programmes tels que le serveur SSH tenteront de "passer" le type de terminal qui se trouve à l'extrémité client de la connexion. Habituellement, il existe un menu ou une option de configuration à choisir parmi les émulations de terminal.

La main saisissante

La bonne façon de détecter la capacité de couleur n'est pas de câbler une liste de types de terminaux dans votre script. Il existe énormément de types de terminaux qui prennent en charge la couleur.

La bonne façon est de regarder ce que termcap / terminfo dit sur votre type de terminal.

couleur = 0
si tput Co> / dev / null 2> & 1
puis
    test "` tput Co` "-gt 2 && color = 1
couleurs elif tput> / dev / null 2> & 1
puis
    test "` tput colors` "-gt 2 && color = 1
Fi

Lectures complémentaires

  • Jonathan de Boyne Pollard (2018). TERM. Guide de nosh . Logiciels.
JdeBP
la source
Ce qui suit existe dans le .bashrc par défaut dans Debian jessie: [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes. (ncurses 5.9)
thom_nic
2
tput CoRenvoie également une "capacité terminfo inconnue" dans Jessie et Xenial. tput colorset les tput setaf 1deux semblent fonctionner bien que j'avoue que je ne comprends pas pourquoi .
thom_nic
2

Veuillez consulter /ubuntu//a/614714/398785 pour ma réponse détaillée sur les raisons pour lesquelles je pense que TERM=xterm-colorc'est la mauvaise approche et celle d'Ubuntu .bashrcest obsolète. Je vous recommande d'aller avec TERM=xterm-256color(qui est la valeur par défaut depuis gnome-terminal 3.16, mais également sûr à utiliser avec les anciens gnome-terminaux), et d'ajuster votre en .bashrcconséquence.

egmont
la source
1
+1 pour votre lien. Suggestion mineure; la phrase suivante peut prêter à confusion (j'ai d'abord eu l'impression que vous disiez que l'utilisation .bashrcest obsolète). ".Bashrc d'Ubuntu est obsolète."
IsaacS
@IsaacS Avez-vous des suggestions pour l'améliorer? Par exemple, remplacer "obsolète" par une aide "obsolète"?
egmont
1
Il semble que les xterm-256colorcauses htopde gâcher sa mise en page comme celui - ci dans Ubuntu 18.04.
Arrêtez de nuire à Monica le
@OrangeDog Dans quel émulateur de terminal? Cette question ici et donc ma réponse se concentre sur GNOME Terminal, tandis que la page que vous avez liée montre Konsole. Le bogue semble que l'émulateur de terminal ne prend pas encore en charge la séquence d'échappement REP que ncurses a commencé à utiliser à cette époque. VTE (GNOME Terminal) avait déjà ajouté un support pour cela dans Ubuntu 18.04, il est probable que Konsole ne l'ait pas fait. Je soupçonne que votre commentaire avec la rupture du htop est valable pour Konsole mais pas pour le terminal GNOME.
egmont
@egmont ne peut pas parler du problème d'origine, mais j'obtiens le même résultat avec le terminal WSL (quel qu'il soit).
Arrêtez de nuire à Monica le