No hay valor para $ TERM y no se especifica -T

22

Recientemente actualicé (con apt-get dist-upgrade) mis cajas de Linux Kubuntu y Lubuntu, y ahora cada vez que inicio sesión en una de estas máquinas, recibo este mensaje:

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

Aquí hay una captura de pantalla del mensaje exacto: tput: sin valor para $ TERM y sin -T especificado

Esto sucedió tanto en mi máquina Lubuntu como en la máquina Kubuntu, y no fue un problema hasta después de la actualización; así que sospecho que no fue un error del usuario.

¿Cómo puedo arreglar esto?

ACTUALIZAR

He rastreado esto hasta mi archivo .bashrc, que está siendo llamado por mi archivo .profile. Sin embargo, el hecho de que mi archivo .bashrc ahora se ejecuta cuando hago un inicio de sesión GUI, mientras que no lo hacía antes de actualizar es un poco extraño. Y no, no he modificado mi archivo .bashrc o mi .profile recientemente. Además, bash no es mi shell predeterminado.

El problema es que estoy llamando tputa mi archivo .bashrc para configurar variables para agregar color al indicador. Pero en el momento (inapropiado) cuando mi archivo .bashrc ahora se ejecuta, $TERMno está configurado.

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)

Pregunta actualizada: ¿Cómo debo solucionar esto? ¿Debo establecerme $TERM? ¿O simplemente no debería establecer estas variables si $TERMno está configurado?

ACTUALIZACIÓN 2

Una solución que intenté fue verificar si $TERMestaba configurado. Pero esto no parecía funcionar; Todavía recibí el mismo mensaje de error. Aquí está el código:

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

Así que aparentemente $TERM estaba listo, pero tputaún así concluyó que no.

Sildoreth
fuente
1
Si no me equivoco se .profileejecuta independientemente del shell predeterminado
Sergiy Kolodyazhnyy
@Serg pero durante un inicio de sesión de shell GUI? Además, no siempre vi este problema.
Sildoreth
Bueno, sí, debería ejecutarse cuando el usuario inicia sesión y esto es exactamente lo que estaba haciendo
Sergiy Kolodyazhnyy

Respuestas:

13

Lo que finalmente funcionó para mí fue verificar si el shell era un shell interactivo. Basé la solución en esta otra publicación en unix.stackexchange: Cómo verificar si un shell es login / interactive / batch .

Entonces el código para la solución fue:

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
fuente
Ajá, esa es una solución elegante. :)
Gunnar Hjalmarsson
2
Si esto está dentro .bashrc, me parece sorprendente. El valor predeterminado .bashrccontiene: # If not running interactively, don't do anything case $- in *i*) ;; *) return;;por lo que su configuración no debe aplicarse a menos que sea interactiva.
Muru
@muru Mi archivo .bashrc es muy no predeterminado. :)
Sildoreth
¿Pero dónde hiciste eso? en .bashrc?
jjmerelo
Creo que si coloca esto en la parte superior de su archivo, está más limpio: [[ $- == *i* ]] || returnRef: ( askubuntu.com/a/1070182/362122 )
Klik
9

Si haces esto

if tty -s
then
    : # your tput commands
fi

Arreglará tu problema. Sin la opción -s, tty mostrará su tty o escribirá "not a tty"

Robert Jacobs
fuente
La descripción de ttysu página de manual es "imprimir el nombre del archivo del terminal conectado a la entrada estándar". Si el stdin de su script es una tubería, esta prueba fallará, con la consecuencia de que su programa deja de imprimir colores en su salida solo porque su entrada proviene de una tubería. Quizás test -t 1(en inglés: "¿stdout está conectado a un terminal?") Es lo que realmente quieres? De esta manera se obtiene colores solamente si la salida va a un terminal, y no verá los códigos de terminal extraños si redirige su salida a un archivo o canalizarla a través de, por ejemplo, less.
TheDudeAbides
6

Para mi, agregando

export TERM=xterm

que /etc/profileera la única cosa que solucionó el problema. En realidad, el error nos dio una pista:No value for $TERM

jjmerelo
fuente
4

[ Escenario diferente, pero el motor de búsqueda me condujo aquí primero]

Cuando se produce el error " tput: Sin valor para $ TERM y sin especificación -T " en un contenedor Docker (para mí, al abrir un intérprete de comandos zshdocker exec -it <container> zsh (-i para interactivo)), la única forma de solucionar esto era establecer la variable como ENV TERM xterm-256coloren el Dockerfile para esta imagen.

Enfoques como RUN export TERM=xterm-256color o RUN echo "export TERM=xterm-256color" >> ~/.zshrcno tuvieron éxito. Otros valores para TERM también son posibles.

mga0
fuente
3

Intente abrir la terminal (no importa qué, incluso tty1 lo hará) y ejecute esta línea

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

Se le presentará la opción del emulador de terminal predeterminado para la ventana x. Elija uno seleccionando el número y reinicie después de que haya terminado.

$ sudo update-alternative --config x-terminal-emulator
Hay 6 opciones para la alternativa x-terminal-emulator (que proporciona / 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
fuente
Cuando intento esto, me dice "Solo hay una alternativa en el grupo de enlaces x-terminal-emulator [...] Nada que configurar". Esto está en mi máquina Kubuntu.
Sildoreth
Intente instalar otro emulador de terminal, por ejemplo, gnome-terminalosakura
Sergiy Kolodyazhnyy
Tuve exactamente el mismo problema. He seleccionado sakura. Sin embargo, esto parece ser un problema con el contenedor de terminal gnome; Si es así, ¿por qué no arreglar eso?
jjmerelo
No soluciona el problema, en realidad.
jjmerelo
2
@jjmerelo Como OP reveló más tarde en su respuesta, tenía líneas en su archivo .bashrc, que estaba dando el error. Gnome terminal wrapper no debería ser el problema. Mi suposición inicial fue que la variable $ TERM no estaba establecida, que era otro usuario, Gunnar, mencionado en su respuesta.
Sergiy Kolodyazhnyy
1

El diálogo de error se debe a la corrección del error # 678421 , por lo que es mi culpa. ;) Le informa acerca de los errores debidos a algunos comandos en uno de sus archivos de configuración. Si se desplaza hacia la parte superior, puede ver qué archivo está causando los mensajes de error.

Posiblemente la respuesta de Serg sea suficiente para deshacerse del diálogo de advertencia.

Editar:

Me gustaría agregar un par de cosas debido a la pregunta actualizada.

A diferencia de antes, /usr/sbin/lightdm-sessionahora se ejecuta bajo bash (anteriormente sh). Es por eso que su abastecimiento de ~/.profileresultados en ~/.profileabastecimiento ~/.bashrc. Posiblemente esto significa que los contenidos predeterminados de ~/.profiledeberían modificarse.

Lo más fácil que puede hacer para solucionarlo es, como sugirió, llamar solo a tput si se establece $ TERM.

Gunnar Hjalmarsson
fuente
Traté de verificar si $ TERM estaba configurado, pero no parecía funcionar.
Sildoreth
@Sildoreth: ¿Puede mostrarnos el código exacto para hacerlo? (Edite su pregunta nuevamente.)
Gunnar Hjalmarsson
agregado a la pregunta
Sildoreth
@Sildoreth: Lo vi. Tal vez sea porque tput se llama en subprocesos. (Solo una suposición.) De todos modos, encontraste una buena manera de lidiar con eso.
Gunnar Hjalmarsson