J'ai récemment mis à niveau (avec apt-get dist-upgrade
) mes boîtes Linux Kubuntu et Lubuntu, et maintenant à chaque fois je me connecte à l'une de ces machines, le message suivant s'affiche:
tput: No value for $TERM and no -T specified
Voici une capture d'écran du message exact:
Cela s'est produit à la fois sur ma machine Lubuntu et sur ma machine Kubuntu, et ce ne fut un problème que depuis la mise à niveau. donc je soupçonne que ce n'était pas une erreur de l'utilisateur.
Comment puis-je réparer cela?
UPDATE
Je l'ai retrouvé dans mon fichier .bashrc, appelé par mon fichier .profile. Cependant, le fait que mon fichier .bashrc s'exécute maintenant lorsque je me connecte à une interface utilisateur alors qu'il ne l'était pas avant la mise à niveau est un peu étrange. Et non, je n'ai pas modifié mon fichier .bashrc ou mon .profile récemment. En outre, bash n'est pas mon shell par défaut.
Le problème est que j'appelle tput
dans mon fichier .bashrc pour configurer des variables à utiliser pour ajouter de la couleur à l'invite. Mais au moment (inapproprié) où mon fichier .bashrc est maintenant exécuté, $TERM
n'est pas défini.
fgRed=$(tput setaf 1) ; fgGreen=$(tput setaf 2) ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7) ; fgBlack=$(tput setaf 0)
bgRed=$(tput setab 1) ; bgGreen=$(tput setab 2) ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7) ; bgBlack=$(tput setab 0)
Question mise à jour: Comment dois-je résoudre ce problème? Dois-je définir $TERM
moi-même? Ou devrais-je tout simplement pas définir ces variables si $TERM
n'est pas défini?
PDATE 2
Une solution que j'ai essayée était de vérifier si $TERM
était défini. Mais cela n'a pas semblé fonctionner. J'ai toujours le même message d'erreur. Voici le code:
if [ ! "$TERM" = "" ]; then
#Do stuff here
fi
Donc, apparemment, $TERM
était défini , mais tput
a néanmoins conclu que ce n'était pas le cas.
Ce qui a finalement fonctionné pour moi a été de vérifier si le Shell était un Shell interactif. J'ai basé la solution sur cet autre message à l'adresse unix.stackexchange: Comment vérifier si un shell est connecté/interactif/batch .
Le code de la solution était donc le suivant:
if [[ $- == *i* ]]; then
fgRed=$(tput setaf 1) ; fgGreen=$(tput setaf 2) ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7) ; fgBlack=$(tput setaf 0)
bgRed=$(tput setab 1) ; bgGreen=$(tput setab 2) ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7) ; bgBlack=$(tput setab 0)
fi
Si tu fais ça
if tty -s
then
: # your tput commands
fi
Cela résoudra votre problème. Sans l'option -s, tty affichera votre tty ou écrira "not a tty"
Pour moi, ajouter
export TERM=xterm
/etc/profile
était la seule chose qui résolve le problème. En fait, l'erreur nous a donné un indice: No value for $TERM
[ Scénario différent, mais le moteur de recherche me mène ici en premier]
Lorsque " tput: aucune valeur pour $ TERM ni aucun -T spécifié " une erreur se produit dans un conteneur Docker (pour moi, lors de l'ouverture d'un zsh Shell appelant docker exec -it <container> zsh
(-i pour interactive)), le seul moyen de résoudre ce problème consistait à définir la variable comme ENV TERM xterm-256color
dans le fichier de docker pour cette image.
Des approches telles que RUN export TERM=xterm-256color
ou RUN echo "export TERM=xterm-256color" >> ~/.zshrc
ont échoué. D'autres valeurs pour TERM sont également possibles.
Essayez d’ouvrir le terminal (peu importe ce que même tty1 fera) et lancez cette ligne
Sudo update-alternatives --config x-terminal-emulator
On vous présentera le choix de l'émulateur de terminal par défaut pour la fenêtre x. Choisissez-en un en sélectionnant le numéro et redémarrez après avoir terminé.
$ Sudo update-alternatives --config x-terminal-emulator
Il existe 6 choix pour l’émulateur alternatif x-terminal (fournissant/usr/bin/x-terminal-emulator).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gnome-terminal.wrapper 40 auto mode
1 /usr/bin/gnome-terminal.wrapper 40 manual mode
2 /usr/bin/koi8rxterm 20 manual mode
* 3 /usr/bin/lxterm 30 manual mode
4 /usr/bin/sakura 40 manual mode
5 /usr/bin/uxterm 20 manual mode
6 /usr/bin/xterm 20 manual mode
Press enter to keep the current choice[*], or type selection number:
La boîte de dialogue d'erreur est due à la correction de bogue n ° 678421 , c'est donc ma faute. ;) Il vous informe des erreurs dues à une ou plusieurs commandes dans l’un de vos fichiers de configuration. Si vous faites défiler vers le haut, vous pouvez voir quel fichier est à l'origine des messages d'erreur.
Peut-être que la réponse de Serg est suffisante pour supprimer le dialogue d'avertissement.
Modifier:
Voudrais ajouter quelques éléments à la suite de la mise à jour de la question.
À la différence d’avant, /usr/sbin/lightdm-session
est maintenant exécuté sous bash (auparavant sh). C'est pourquoi son code source ~/.profile
donne ~/.profile
sourcing ~/.bashrc
. Peut-être cela signifie-t-il que le contenu par défaut de ~/.profile
devrait être modifié.
La solution la plus simple pour y remédier est, comme vous l’avez suggéré, d’appeler tput uniquement si $ TERM est défini.