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 aS0: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 leerEnvironment=TERM=vt100
establecer el
TERM
variable en el entorno pasada aagetty
. - 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 estableceTERM
de eso en el entorno que ejecutagetty
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
ovc-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 dicenEnvironment=TERM=linux
establecer el
TERM
variable en el entorno pasada aagetty
.
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.