GNU/Linux >> Tutoriales Linux >  >> Linux

¿Dónde se establece el término valor predeterminado de la variable de entorno?

Cuando abro una ventana de terminal con el emulador de terminal GNOME en la GUI de escritorio, la variable de entorno TERM de shell tiene el valor predeterminado xterm .

Si uso CTL +ALT +F1 para cambiar a una ventana TTY de consola y echo $TERM el valor se establece en linux .

Mi motivación para preguntar es que dentro de mi ~/.bashrc Se utiliza una variable para determinar si se proporciona una carcasa de color o simplemente un buen monocromo antiguo.

# 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 Gnome Terminal si escribo

export TERM=xterm-color
source /.bashrc

ambos caparazones cambian al modo de color (algo que me gustaría que sucediera siempre en ambos).

¿Dónde está el TERM predeterminado? los valores se establecen por favor y ¿cuál 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 TÉRMINO predeterminado.

Consideré simplemente agregar la línea export TERM=xterm-color en la parte superior de mi ~/.bashrc pero mi instinto me dice que esta no es la mejor solución y mis búsquedas en Google aún no me han llevado a una buena respuesta.

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

Respuesta aceptada:

En muchos lugares, dependiendo

En terminales virtuales y terminales reales, el TERM la variable de entorno la establece el programa que se encadena a login , y se hereda hasta el shell interactivo que se ejecuta una vez que uno ha iniciado sesión. Dónde, precisamente, esto sucede varía de un sistema a otro, y según el tipo de terminal.

terminales reales

Los terminales reales, en serie, pueden variar en tipo, según lo que haya en el otro extremo del cable. Entonces, convencionalmente, el getty el programa se invoca con un argumento que especifica el tipo de terminal, o se le pasa el TERM programa a partir de los datos de configuración del servicio de un administrador de servicios.

  • En van Smoorenburg init sistemas, uno puede ver esto en /etc/inittab entradas, que leerán algo similar a

    S0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav

    El último argumento de agetty en esa línea, vt100-nav , es el tipo de terminal establecido para /dev/ttyS0 . Así que /etc/inittab es donde cambiar el tipo de terminal para terminales reales en dichos sistemas.

  • En los sistemas systemd, uno solía poder ver esto en el /usr/lib/systemd/system/[email protected] archivo de unidad (/lib/systemd/system/[email protected] en sistemas no fusionados), que solía leer

    Environment=TERM=vt100

    establecer el TERM variable en el entorno pasada a agetty .

  • En los BSD, init toma el tipo de terminal del tercer campo de la entrada de cada terminal en /etc/ttys base de datos, y establece TERM de eso en el entorno que ejecuta getty con. Así que /etc/ttys es donde se cambia el tipo de terminal por terminales reales en los BSD.

variabilidad de systemd

El [email protected] El archivo de unidad de servicio, o los archivos desplegables que se aplican al mismo, es donde se cambia el tipo de terminal para terminales reales en sistemas systemd. Tenga en cuenta que dicho cambio se aplica a todos servicios de inicio de sesión de terminal que emplean esta plantilla de unidad de servicio. (Para cambiarlo solo para terminales individuales, uno tiene que instanciar manualmente la plantilla o agregar complementos que solo se aplican a las instancias).

systemd ha tenido al menos cuatro mecanismos durante su vida útil para recoger el valor de TERM Variable ambiental. En el momento de escribir esta respuesta por primera vez, como se puede ver, había un Environment=TERM=something línea en los archivos de la unidad de servicio de plantilla. En otras ocasiones, los tipos linux y vt102 estaban integrados en el getty y serial-getty archivos de la unidad de servicio respectivamente. Más recientemente, la variable de entorno se heredó del proceso n.º 1, que la configuró de varias formas.

A partir de 2020, la forma en que systemd decide qué tipo de terminal especificar en el TERM de un servicio La variable de entorno es bastante compleja y no está documentada en absoluto. La forma de cambiarlo sigue siendo un archivo de configuración desplegable con Environment=TERM=something . Pero de dónde se origina el valor predeterminado es bastante variable. Sujeto a algunas reglas bastante complejas de explicar que involucran el TTYPath= configuraciones de unidades de servicio individuales, puede ser uno de tres valores:un linux cableado , un vt220 cableado (ya no vt102 ), o el valor de TERM variable de entorno que heredó el proceso n.º 1, generalmente del kernel/cargador de arranque.

(Irónicamente, el getttyent() mecanismo todavía existe en la biblioteca GNU C, y systemd podría haber reutilizado el /etc/ttys mecanismo.)

terminales virtuales del núcleo

Los terminales virtuales del kernel, como habrás 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 integrado del kernel. En Linux, ese tipo coincide con linux de la base de datos terminfo. (La emulación de terminal del kernel de FreeBSD desde la versión 9 ha sido teken . Antes de la versión 9 era cons25 OpenBSD es pccon .)

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

    Environment=TERM=linux

    establecer el TERM variable en el entorno pasada a agetty .

Para terminales virtuales del kernel, uno no cambiar el tipo de terminal. Después de todo, el programa emulador de terminal en el kernel no cambia. Es incorrecto para cambiar el tipo. En particular, esto estropeará el reconocimiento de secuencia CSI del cursor/tecla de edición. El linux Las secuencias CSI enviadas por el emulador de terminal del kernel de Linux son diferentes al xterm o vt100 Secuencias CSI enviadas por programas emuladores de terminal GUI en modo DEC VT. (De hecho, son muy idiosincrásicos y no estándar, y diferentes tanto de todos los terminales reales que conozco como de casi todos los demás emuladores de terminales de software, aparte del integrado en Linux).

Emuladores de terminal GUI

Su emulador de terminal GUI es uno de muchos programas, desde el demonio SSH hasta screen , que utiliza pseudo-terminales. El tipo de terminal depende del programa emulador de terminal que se esté ejecutando en el lado maestro del pseudoterminal y de cómo esté configurado. La mayoría de los emuladores de terminales GUI iniciarán el programa en el lado esclavo con un TERM variable cuyo valor coincide con su emulación de terminal en el lado maestro. Los programas como el servidor SSH intentarán "pasar a través" del tipo de terminal que está en el extremo del cliente de la conexión. Normalmente hay alguna opción de menú o configuración para elegir entre las emulaciones de terminal.

La mano que agarra

La forma correcta de detectar la capacidad de color es no para conectar una lista de tipos de terminales en su secuencia de comandos. Hay una gran cantidad de tipos de terminales que admiten color.

La forma correcta es mirar lo que dice termcap/terminfo sobre su tipo 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

Lecturas adicionales

  • Jonathan de Boyne Pollard (2018). TERM . Guía de comida . Software.

Linux
  1. ¿Cómo determinar de dónde vino una variable de entorno?

  2. ¿Vista completa de dónde se establece la variable de ruta en Bash?

  3. ¿Establecer +a no desarma la bandera -a?

  4. ¿Cómo cambiar el idioma de mi git?

  5. Variable de entorno TERM no establecida

Cómo establecer la variable de entorno en Windows

Cómo establecer variables de entorno en MacOS

Cómo configurar el emulador de terminal predeterminado de Gnome en Ubuntu 18.04 LTS

Cómo configurar el terminal predeterminado (o administrador de ventanas, navegador y mucho más) en Linux

Cómo establecer la variable de entorno en Bash

¿Dónde guarda Linux Mint los archivos para los fondos de escritorio predeterminados?