¿Dónde se establece la variable de entorno TERM predeterminada?

26

Cuando abro una ventana de terminal con el emulador de terminal de GNOME en la GUI del escritorio, la variable de entorno TERM de shell se predetermina al valor xterm.

Si uso CTL+ ALT+ F1para cambiar a una ventana TTY de consola y echo $TERMel valor se establece en linux.

Mi motivación para preguntar es que dentro de mi ~/.bashrcarchivo se usa una variable para determinar si se proporciona un caparazón de color o simplemente un monocromo anticuado.

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

Tanto en el shell de la consola como en el shell del emulador de terminal Gnome si escribo

export TERM=xterm-color
source /.bashrc

ambas conchas cambian al modo de color (algo que me gustaría que ocurriera siempre en ambas).

¿Dónde se establecen los TERMvalores predeterminados y dónde es el mejor lugar para cambiar sus valores predeterminados, si es posible? Parece que no hay nada en la GUI del emulador de terminal para seleccionar o establecer el valor TERM predeterminado.

Pensé en agregar la línea export TERM=xterm-coloren la parte superior de mi ~/.bashrcarchivo, pero mi instinto me dice que esta no es la mejor solución y que mis búsquedas en Google todavía no me han dado una buena respuesta.

Estoy ejecutando Ubuntu 15.04 Desktop Edition (basado en Debian).

Andy Fusniak
fuente

Respuestas:

17

En muchos lugares, dependiendo

En terminales virtuales y terminales reales, la TERMvariable de entorno la establece el programa al que se encadena loginy se hereda todo el camino hasta el shell interactivo que se ejecuta una vez que uno ha iniciado sesión. Donde, precisamente, esto sucede varía de un sistema a otro, y de acuerdo con el tipo de terminal.

Los terminales reales, seriales, pueden variar en tipo, de acuerdo con lo que hay en el otro extremo del cable. De manera convencional, el gettyprograma se invoca con un argumento que especifica el tipo de terminal, o se pasa el TERMprograma desde los datos de configuración del servicio de un administrador de servicios.

  • En los initsistemas de van Smoorenburg , se puede ver esto en las /etc/inittabentradas, que leerán algo similar a

    S0: 3: reaparecer: / sbin / agetty ttyS0 9600 vt100-nav
    El último argumento para agettyen esa línea vt100-nav, es el tipo de terminal establecido para /dev/ttyS0. Entonces, /etc/inittabes dónde cambiar el tipo de terminal para terminales reales en tales sistemas.
  • En sistemas systemd, uno puede ver esto en el /usr/lib/systemd/system/[email protected]archivo de la unidad ( /lib/systemd/system/[email protected]en sistemas no fusionados), que lee

    Entorno = TERM = vt100
    establecer la TERMvariable en el entorno pasado a agetty. Este archivo de unidad de servicio es donde cambiar el tipo de terminal para terminales reales en tales sistemas. Tenga en cuenta que se aplica a todos los terminales reales que emplean esta plantilla de unidad de servicio. (Para cambiarlo solo por terminales individuales, se debe crear una instancia manual de la plantilla).
  • En los BSD, inittoma el tipo de terminal del tercer campo de la entrada de cada terminal en la /etc/ttysbase de datos y lo establece TERMen el entorno con el que se ejecuta getty. Entonces /etc/ttyses donde uno cambia el tipo de terminal para terminales reales en los BSD.

Los terminales virtuales del kernel, como ha notado, tienen un tipo fijo. A diferencia de NetBSD, que puede variar el tipo de terminal virtual del kernel sobre la marcha, Linux y los otros BSD tienen un único tipo de terminal fijo implementado en el programa de emulación de terminal incorporado del kernel. En Linux, ese tipo coincide linuxcon la base de datos terminfo. (La emulación de terminal de kernel de FreeBSD es un xtermsubconjunto limitado desde la versión 9.)

  • En los sistemas que usan mingettyo vc-get-tty(del paquete nosh) el programa "sabe" que solo puede estar hablando con un terminal virtual, y conectan los tipos de terminal virtual "conocidos" apropiados para el sistema operativo para el que se compiló el programa.
  • En sistemas systemd, uno puede ver esto en el /usr/lib/systemd/system/[email protected]archivo de la unidad ( /lib/systemd/system/[email protected]en sistemas no fusionados), que lee

    Entorno = TERM = Linux
    establecer la TERMvariable en el entorno pasado a agetty.

Para terminales virtuales del kernel, uno no cambia el tipo de terminal. El programa emulador de terminal en el núcleo no cambia, después de todo. Es incorrecto cambiar el tipo. En particular, esto arruinará el cursor / tecla de edición de reconocimiento de secuencia CSI. Las linuxsecuencias de CSI enviado por emulador de terminal del núcleo de Linux son diferentes a los xtermo vt100las secuencias CSI enviado por los programas de emulación de terminal GUI en modo DEC VT.

Su emulador de terminal GUI es uno de los muchos programas, desde el demonio SSH hasta screen, que utiliza pseudo terminales. El tipo de terminal depende de qué programa de emulador de terminal se esté ejecutando en el lado maestro del pseudo-terminal y de cómo esté configurado. La mayoría de los emuladores de terminal GUI iniciarán el programa en el lado esclavo con una TERMvariable cuyo valor coincida con su emulación de terminal en el lado maestro. Programas como el servidor SSH intentarán "pasar" el tipo de terminal que se encuentra en el extremo del cliente de la conexión. Por lo general, hay algún menú u opción de configuración para elegir entre las emulaciones de terminal.

La mano agarradora

La forma correcta de detectar la capacidad de color no es cablear una lista de tipos de terminales en su secuencia de comandos. Hay muchos tipos de terminales que admiten color.

La forma correcta es mirar lo que dice termcap / terminfo sobre su tipo de terminal.

color = 0
si tput Co> / dev / null 2> & 1
luego
    prueba "` tput Co` "-gt 2 && color = 1
colores elif tput> / dev / null 2> & 1
luego
    prueba "` tput colors` "-gt 2 && color = 1
fi

Otras lecturas

  • Jonathan de Boyne Pollard (2018). TERM. nosh Guide . Softwares
JdeBP
fuente
Existe la siguiente en el .bashrc por defecto en Debian Jessie: [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes. (ncurses 5.9)
thom_nic
2
También tput Codevuelve "capacidad terminfo desconocida" en Jessie y Xenial. tput colorsy tput setaf 1ambos parecen funcionar aunque admito que no entiendo por qué .
thom_nic
2

Consulte /ubuntu//a/614714/398785 para obtener una respuesta detallada sobre por qué creo que TERM=xterm-colores un enfoque incorrecto y Ubuntu .bashrces obsoleto. Le recomiendo que vaya con TERM=xterm-256color(que es el valor predeterminado desde gnome-terminal 3.16, pero también seguro de usar con terminales gnome más antiguos), y ajuste su .bashrccorrespondiente.

egmont
fuente
1
+1 para tu enlace. Sugerencia menor; la siguiente oración puede ser confusa (primero tuve la impresión de que estabas diciendo que usar .bashrces obsoleto). "El .bashrc de Ubuntu está obsoleto".
IsaacS
@IsaacS ¿Tienes alguna sugerencia de cómo mejorarlo? Por ejemplo, ¿reemplazar "obsoleto" por ayuda "obsoleta"?
egmont
1
Parece que xterm-256colorcausa htopun error en su diseño como este en Ubuntu 18.04.
Deja de dañar a Mónica el
@OrangeDog ¿En qué emulador de terminal? Esta pregunta aquí y, por lo tanto, mi respuesta se centra en el Terminal GNOME, mientras que la página que vinculaste muestra a Konsole. El error parece que el emulador de terminal aún no es compatible con la secuencia de escape REP que ncurses comenzó a usarse en ese momento. VTE (Terminal GNOME) ya había agregado soporte para ello en Ubuntu 18.04, lo más probable es que Konsole no. Sospecho que su comentario con la rotura htop es válido para Konsole pero no para el Terminal GNOME.
egmont
@egmont no puede hablar por el problema original, pero obtengo el mismo resultado con el terminal de WSL (sea lo que sea).
Deja de dañar a Mónica el