Aucune valeur pour $ TERM et aucun -T spécifié

22

J'ai récemment mis à niveau (avec apt-get dist-upgrade) mes boîtiers Linux Kubuntu et Lubuntu, et maintenant chaque fois que je me connecte à l'une de ces machines, je reçois ce message:

tput: No value for $TERM and no -T specified

Voici une capture d'écran du message exact: tput: Aucune valeur pour $ TERM et aucun -T spécifié

Cela s'est produit à la fois sur ma machine Lubuntu et sur ma machine Kubuntu, et ce n'était pas un problème avant ma mise à niveau; donc je soupçonne que ce n'était pas une erreur utilisateur.

Comment puis-je réparer cela?

MISE À JOUR

J'ai retrouvé cela dans mon fichier .bashrc, qui est appelé par mon fichier .profile. Cependant, le fait que mon fichier .bashrc s'exécute maintenant lorsque je me connecte à l'interface graphique alors qu'il ne l'était pas avant la mise à niveau est un peu bizarre. Et non, je n'ai pas modifié mon fichier .bashrc ou mon .profile récemment. De plus, bash n'est pas mon shell par défaut.

Le problème est que j'appelle tputdans mon fichier .bashrc pour configurer des variables à utiliser pour ajouter de la couleur à l'invite. Mais au moment (inapproprié) où mon fichier .bashrc s'exécute maintenant, $TERMn'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 résoudre ce problème? Dois-je $TERMme fixer ? Ou devrais-je simplement ne pas définir ces variables si ce $TERMn'est pas le cas?

MISE À JOUR 2

Une solution que j'ai essayée était de vérifier si elle $TERMétait réglée. Mais cela ne semblait pas fonctionner; J'ai toujours le même message d'erreur. Voici le code:

if [ ! "$TERM" = "" ]; then
  #Do stuff here
fi

Donc, apparemment, $TERM c'était réglé, mais tputtoujours conclu que ce n'était pas le cas.

Sildoreth
la source
1
Si je ne me trompe pas, .profilequel que soit le shell par défaut
Sergiy Kolodyazhnyy
@Serg mais lors d'une connexion au shell GUI? De plus, je n'ai pas toujours vu ce problème.
Sildoreth
Eh bien, oui, il devrait être exécuté lors de la connexion des utilisateurs et c'est exactement ce que vous faisiez
Sergiy Kolodyazhnyy

Réponses:

13

Ce qui a finalement fonctionné pour moi était de vérifier si le shell était un shell interactif. J'ai basé la solution sur cet autre article sur unix.stackexchange: comment vérifier si un shell est login / interactif / batch .

Le code de la solution était donc:

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
Sildoreth
la source
Aha, c'est une solution élégante. :)
Gunnar Hjalmarsson
2
Si c'est le cas .bashrc, je trouve cela surprenant. La valeur par défaut .bashrccontient :, # If not running interactively, don't do anything case $- in *i*) ;; *) return;;donc vos paramètres ne doivent pas être appliqués sauf s'ils sont interactifs.
muru
@muru Mon fichier .bashrc n'est pas par défaut. :)
Sildoreth
Mais où avez-vous fait ça? dans .bashrc?
jjmerelo
Je pense que si vous mettez cela en haut de votre fichier, c'est plus propre: [[ $- == *i* ]] || returnRéf: ( askubuntu.com/a/1070182/362122 )
Klik
9

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"

Robert Jacobs
la source
La description de ttysa page de manuel est "imprimer le nom de fichier du terminal connecté à l'entrée standard". Si le stdin de votre script est un tube, ce test échouera, avec pour conséquence que votre programme arrête d'imprimer les couleurs dans sa sortie juste parce que son entrée provient d'un tube. Peut-être test -t 1(en anglais: "stdout est-il connecté à un terminal?") Est-ce vraiment ce que vous voulez? De cette façon, vous obtenez des couleurs uniquement si la sortie va vers un terminal, et vous ne verrez pas de codes de terminal étranges si vous redirigez sa sortie vers un fichier ou si vous la dirigez, disons less.
TheDudeAbides
6

Pour moi, ajouter

export TERM=xterm

à /etc/profileétait la seule chose qui a résolu le problème. En fait, l'erreur nous a donné un indice:No value for $TERM

jjmerelo
la source
4

[ Scénario différent, mais le moteur de recherche me conduit ici en premier]

Lorsque l' erreur " tput: Aucune valeur pour $ TERM et aucun -T spécifié " ne se produit dans un conteneur Docker (pour moi, lors de l'ouverture d'un shell zsh appelant docker exec -it <container> zsh(-i pour interactif)), la seule façon de résoudre ce problème était de définir la variable comme ENV TERM xterm-256colordans le Dockerfile pour cette image.

Des approches comme RUN export TERM=xterm-256color ou qui RUN echo "export TERM=xterm-256color" >> ~/.zshrcn'ont pas réussi. D'autres valeurs pour TERM sont également possibles.

mga0
la source
3

Essayez d'ouvrir le terminal (peu importe lequel, même tty1 fera l'affaire) et exécutez cette ligne

sudo update-alternatives --config x-terminal-emulator

Vous serez invité à choisir l'émulateur de terminal par défaut pour x window. Choisissez-en un en sélectionnant le numéro et redémarrez après avoir terminé.

$ sudo update-alternatives --config x-terminal-emulator
Il y a 6 choix pour l'alternative x-terminal-emulator (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:  
Sergiy Kolodyazhnyy
la source
Lorsque j'essaye, il me dit "Il n'y a qu'une seule alternative dans le groupe de liens x-terminal-emulator [...] Rien à configurer". C'est sur ma machine Kubuntu.
Sildoreth
Essayez d'installer un autre émulateur de terminal, par exemple gnome-terminalousakura
Sergiy Kolodyazhnyy
J'ai eu exactement le même problème. J'ai sélectionné sakura. Cependant, cela semble être un problème avec le wrapper de terminal gnome; si oui, pourquoi ne pas arranger ça?
jjmerelo
En fait, cela ne résout pas le problème.
jjmerelo
2
@jjmerelo Comme OP l'a révélé plus tard dans sa réponse, il avait des lignes dans son fichier .bashrc, qui donnait l'erreur. Le wrapper de terminal Gnome ne devrait pas être le problème. Ma conjecture était initialement que la variable $ TERM n'était pas définie, ce qui était un autre utilisateur, Gunnar, mentionné dans sa réponse.
Sergiy Kolodyazhnyy
1

La boîte de dialogue d'erreur est due à la correction du bogue # 678421 , c'est donc ma faute. ;) Il vous informe des erreurs dues à certaines 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 se débarrasser de la boîte de dialogue d'avertissement.

Modifier:

J'aimerais ajouter quelques éléments en raison de la question mise à jour.

Contrairement à avant, /usr/sbin/lightdm-sessionest maintenant exécuté sous bash (auparavant sh). C'est pourquoi son sourcing de ~/.profilerésultats dans le ~/.profilesourcing ~/.bashrc. Cela signifie peut-être que le contenu par défaut de ~/.profiledoit être modifié.

Comme vous l'avez suggéré, la chose la plus simple que vous puissiez faire pour le corriger est d'appeler tput uniquement si $ TERM est défini.

Gunnar Hjalmarsson
la source
J'ai essayé de vérifier si $ TERM était défini, mais cela ne semblait pas fonctionner.
Sildoreth
@Sildoreth: Pouvez-vous s'il vous plaît nous montrer le code exact pour le faire? (Veuillez modifier à nouveau votre question.)
Gunnar Hjalmarsson
ajouté à la question
Sildoreth
@Sildoreth: Je l'ai vu. C'est peut-être parce que tput est appelé dans des sous-processus. (Juste une supposition.) Quoi qu'il en soit, vous avez trouvé un bon moyen de le gérer.
Gunnar Hjalmarsson