Lorsque j'ouvre une fenêtre de terminal avec l'émulateur de terminal GNOME dans l'interface graphique du bureau, la variable d'environnement TERM du shell prend par défaut la valeur xterm .
Si j'utilise CTL +ALT +F1 pour passer à une fenêtre TTY de console et echo $TERM la valeur est définie sur linux .
Ma motivation pour demander est que dans mon ~/.bashrc fichier 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 que cela se produise toujours dans les deux).
D'où vient le TERM par défaut les valeurs sont définies s'il vous plaît et où est le meilleur endroit pour modifier leurs valeurs par défaut, si possible ? Il semble qu'il n'y ait rien dans l'interface graphique de l'émulateur de terminal pour sélectionner ou définir la valeur TERM par défaut.
J'ai simplement envisagé d'ajouter la ligne export TERM=xterm-color en haut de mon ~/.bashrc fichier mais mon instinct me dit 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).
Réponse acceptée :
Dans de nombreux endroits, selon
Sur les terminaux virtuels et les terminaux réels, le TERM la variable d'environnement est définie par le programme qui s'enchaîne à login , et est hérité tout le long du shell interactif qui s'exécute une fois que l'on s'est connecté. L'endroit précis où cela se produit varie d'un système à l'autre et selon le type de terminal.
terminaux réels
Les terminaux réels, en série, peuvent varier en type, selon ce qui se trouve à l'autre extrémité du fil. Donc classiquement le getty le programme est appelé avec un argument qui spécifie le type de terminal, ou reçoit le TERM programme à partir des données de configuration de service d'un gestionnaire de services.
- Sur van Smoorenburg
initsystèmes, on peut le voir dans/etc/inittabentrées, qui liront quelque chose dans le sens deS0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav
Le dernier argument de
agettydans cette ligne,vt100-nav, est le type de terminal défini pour/dev/ttyS0. Donc/etc/inittabest l'endroit où changer le type de terminal pour les terminaux réels sur de tels systèmes. - Sur les systèmes systemd, on pouvait voir ceci dans le
/usr/lib/systemd/system/[email protected]fichier d'unité (/lib/systemd/system/[email protected]sur les systèmes non fusionnés), qui lisaientEnvironment=TERM=vt100
définir le
TERMvariable dans l'environnement passée àagetty. - Sur les BSD,
initprend le type de terminal du troisième champ de l'entrée de chaque terminal dans/etc/ttysbase de données et définitTERMà partir de cela dans l'environnement qu'il exécutegettyavec. Donc/etc/ttysest l'endroit où l'on change le type de terminal pour les vrais terminaux sur les BSD.
variabilité de systemd
Le [email protected] Le fichier d'unité de service, ou les fichiers d'insertion qui s'y appliquent, est l'endroit où changer le type de terminal pour les terminaux réels sur les systèmes systemd. Notez qu'un tel changement s'applique à tous les services de connexion au terminal qui utilisent ce modèle d'unité de service. (Pour le changer uniquement pour des terminaux individuels, il faut instancier manuellement le modèle ou ajouter des drop-ins qui ne s'appliquent qu'aux instanciations.)
systemd a eu au moins quatre mécanismes au cours de sa vie pour récupérer la valeur du TERM variables d'environnement. Au moment de la première rédaction de cette réponse, comme on peut le voir, il y avait un Environment=TERM=something ligne dans les fichiers modèles d'unité de service. À d'autres moments, les types linux et vt102 étaient câblés dans le getty et serial-getty fichiers d'unité de service respectivement. Plus récemment, la variable d'environnement a été héritée du processus 1, qui l'a définie de différentes manières.
À partir de 2020, la façon dont systemd décide du type de terminal à spécifier dans le TERM d'un service La variable d'environnement est assez complexe et n'est pas documentée du tout. La façon de le changer reste un fichier de configuration avec Environment=TERM=something . Mais d'où provient la valeur par défaut est assez variable. Sous réserve de certaines règles assez complexes à expliquer qui impliquent le TTYPath= paramètres des unités de service individuelles, il peut s'agir de l'une des trois valeurs suivantes :un linux câblé , un vt220 câblé (n'est plus vt102 ), ou la valeur du TERM variable d'environnement dont le processus #1 a hérité, généralement du chargeur noyau/bootstrap.
(Ironiquement, le getttyent() existe toujours dans la bibliothèque GNU C, et systemd aurait pu réutiliser le /etc/ttys mécanisme.)
terminaux virtuels du noyau
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 de la base de données terminfo. (L'émulation de terminal du noyau de FreeBSD depuis la version 9 est teken . Avant la version 9, c'était cons25 OpenBSD est pccon .)
- Sur les systèmes utilisant
mingettyouvc-get-tty(à partir du paquet 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 pouvait voir ceci dans le
/usr/lib/systemd/system/[email protected]fichier d'unité (/lib/systemd/system/[email protected]sur les systèmes non fusionnés), qui lisentEnvironment=TERM=linux
définir le
TERMvariable dans l'environnement passée àagetty.
Pour les terminaux virtuels du noyau, on ne le fait pas changer le type de borne. Le programme d'émulation de terminal dans le noyau ne change pas, après tout. C'est incorrect pour changer de type. En particulier, cela bousillera la reconnaissance de la séquence CSI du curseur/touche d'édition. Le linux Les séquences CSI envoyées par l'émulateur de terminal du noyau Linux sont différentes du xterm ou vt100 Séquences CSI envoyées par les programmes d'émulation de terminal GUI en mode DEC VT. (En fait, ils sont très idiosyncratiques et non standard, et différents à la fois de tous les terminaux réels que je connais et de pratiquement tous les autres émulateurs de terminaux logiciels à l'exception de celui intégré à Linux.)
Émulateurs de terminaux graphiques
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 la manière dont il est configuré. La plupart des émulateurs de terminaux GUI démarreront le programme du côté esclave avec un TERM variable dont la valeur correspond à leur émulation de terminal côté maître. Des programmes tels que le serveur SSH tenteront de "transférer" le type de terminal qui se trouve du côté client de la connexion. Il existe généralement un menu ou une option de configuration à choisir parmi les émulations de terminal.
La main agrippante
La bonne façon de détecter la capacité de couleur n'est pas pour câbler une liste de types de terminaux dans votre script. Il existe énormément de types de terminaux prenant en charge la couleur.
La bonne façon est de regarder ce que dit termcap/terminfo à propos de votre type de terminal.
colour=0
if tput Co > /dev/null 2>&1
then
test "`tput Co`" -gt 2 && colour=1
elif tput colors > /dev/null 2>&1
then
test "`tput colors`" -gt 2 && colour=1
fi Autres lectures
- Jonathan de Boyne Pollard (2018).
TERM. Guide bouffe . Logiciels.