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

Lorsque j'ouvre une window de terminal avec l'émulateur de terminal GNOME dans l'interface graphique du bureau, la valeur de la variable d'environnement shell TERM est la valeur xterm .

Si j'utilise CTL + ALT + F1 pour basculer vers une window TTY de la console et que echo $TERM la valeur est définie sur linux .

Ma motivation pour requestr est que dans mon file ~/.bashrc une variable est utilisée pour déterminer si un shell couleur est fourni ou juste un bon vieux monochrome.

 # 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 coquilles changent en mode couleur (quelque chose que j'aimerais avoir toujours dans les deux).

Où se situent les valeurs TERM par défaut, et où est le meilleur endroit pour modifier leurs valeurs par défaut, si possible? Il n'y a rien dans l'interface graphique de l'émulateur de terminal pour sélectionner ou définir la valeur TERM par défaut.

Je n'ai pas pensé à append la ligne d' export TERM=xterm-color en haut de mon file ~/.bashrc mais mon instinct me dit que ce n'est pas la meilleure solution et que mes searchs sur Google ne m'ont pas encore conduit à une bonne réponse.

Je cours Ubuntu 15.04 Desktop Edition (Debian Based).

Dans beaucoup d'endroits, en fonction

Sur les terminaux virtuels et les terminaux réels, la variable d'environnement TERM est définie par le programme qui enstring pour se login et est héritée tout au long du shell interactif qui s'exécute une fois connecté. Où, précisément, cela arrive varie d'un système à l'autre, et selon le type de terminal.

Les terminaux réels, en série, peuvent varier en fonction de ce qui se trouve à l'autre bout du fil. Donc classiquement, le programme getty est invoqué avec un argument qui spécifie le type de terminal, ou est passé le programme TERM partir des données de configuration du service d'un gestionnaire de services.

  • Sur les systèmes init système 5, on peut voir ceci dans les inputs /etc/inittab , qui liront quelque chose comme

      S0: 3: respawn: / sbin / agetty ttyS0 9600 vt100-nav 

    Le dernier argument de agetty dans cette ligne, vt100-nav , est le type de terminal défini pour /dev/ttyS0 . Donc /etc/inittab est l'endroit où changer le type de terminal pour de vrais terminaux sur de tels systèmes.

  • Sur les systèmes systemd, on peut voir cela dans le file /usr/lib/systemd/system/[email protected] unité ( /lib/systemd/system/[email protected] sur les systèmes non-fusionnés), qui lit

      Environnement = TERM = vt100 

    définir la variable TERM dans l'environnement passé à agetty . Ce file 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 model d'unité de service. (Pour le modifier uniquement pour les terminaux individuels, il faut instancier manuellement le model.)

  • Sur les BSD, init prend le type de terminal du troisième champ de l'input de chaque terminal dans la database /etc/ttys et définit TERM dans l'environnement avec lequel il exécute getty . Donc /etc/ttys est l'endroit où l'on modifie le type de terminal pour les vrais terminaux sur les BSD.

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

  • Sur les systèmes utilisant mingetty ou vc-get-tty (à partir du packageage 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 operating system que le programme a été compilé pour.
  • Sur les systèmes systemd, on peut le voir dans le file /usr/lib/systemd/system/[email protected] unité ( /lib/systemd/system/[email protected] sur les systèmes non-fusionnés), qui lit

      Environnement = TERM = Linux 

    définir la variable TERM dans l'environnement passé à agetty .

Pour les terminaux virtuels du kernel, on ne change pas le type de terminal. Le programme d'émulation de terminal dans le kernel ne change pas, après tout. Il est incorrect de changer le type. En particulier, cela va bousiller le slider / modification de la reconnaissance de séquence CSI. Les séquences CSI linux envoyées par l'émulateur de terminal kernel Linux sont différentes des séquences CSI xterm ou vt100 envoyées par les programmes d' vt100 de terminal GUI en mode DEC VT.

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

La main de préhension

La bonne façon de détecter les capacités de couleur n'est pas de connecter une list de types de terminaux dans votre script. Il y a énormément de types de terminaux qui prennent en charge la couleur.

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

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

S'il vous plaît voir https://askubuntu.com/a/614714/398785 pour ma réponse détaillée sur pourquoi je pense TERM=xterm-color est la mauvaise approche et .bashrc Ubuntu est obsolète. Je vous recommand d'utiliser TERM=xterm-256color (qui est la valeur par défaut depuis gnome-terminal 3.16, mais aussi d'utiliser les anciens terminaux gnome) et ajustez votre .bashrc conséquence.