¿Qué tipo de terminal estoy usando?

51

He probado esto con Ubuntu 12.04 y Debian 7. Cuando lo hago

echo $TERM

yo obtengo

xterm

Pero si uso el menú desplegable "ayuda"> "acerca de", entonces dice gnome terminal 3.4.1.1.

¿Esto significa que estoy usando solo gnome-terminal? O simplemente xterm? ¿O es gnome-terminal una extensión de xterm? Estoy confundido.

Mulllhausen
fuente

Respuestas:

49

Lo que es $TERMpara?

La $TERMvariable es para uso de las aplicaciones para aprovechar las capacidades de ese terminal.

Por ejemplo, si un programa quiere mostrar texto en color, primero debe averiguar si el terminal que está utilizando admite texto en color y, si lo hace, cómo hacerlo.

La forma en que esto funciona es que el sistema mantiene una biblioteca de terminales conocidas y sus capacidades. En la mayoría de los sistemas esto está dentro /usr/share/terminfo(también hay un termcap, pero su legado ya no se usa mucho).

Digamos que tiene un programa que quiere mostrar texto rojo. Básicamente hace una llamada a la biblioteca terminfo que dice " dame la secuencia de bytes que tengo que enviar para texto rojo para el terminal xterm ". Luego solo toma esos bytes y los imprime.
Puedes probar esto tú mismo haciendo tput setf 4; echo hi. Esto obtendrá la setfcapacidad de terminfo y le pasará un parámetro de 4, que es el color que desea.


Por qué el terminal gnome miente sobre sí mismo:

Ahora supongamos que tiene un emulador de terminal nuevo y brillante que se acaba de lanzar, y la biblioteca terminfo del sistema aún no tiene una definición. Cuando su aplicación vaya a buscar cómo hacer algo, fallará porque no se conoce el terminal.

La forma en que su terminal evita esto es mintiendo sobre quién es. Entonces tu terminal de gnomos dice " I'm xterm ".

Xterm es un terminal muy básico que ha existido desde los albores de X11 y, por lo tanto, la mayoría de los emuladores de terminales admiten lo que admite. Entonces, al decir que el terminal gnome es un xterm, es más probable que tenga una definición en la biblioteca terminfo.

La desventaja de mentir sobre su tipo de terminal es que el terminal podría admitir mucho más que xterm (por ejemplo, muchos terminales nuevos admiten 256 colores, mientras que los terminales más antiguos solo admitían 16). Por lo tanto, tiene una compensación, obtiene más funciones o tiene más compatibilidad. La mayoría de los terminales optarán por una mayor compatibilidad y, por lo tanto, eligen anunciarse como xterm.

Si desea anular esto, muchos terminales ofrecerán alguna forma de configurar el comportamiento. Pero también puedes hacerlo export TERM=gnome-terminal.

Patricio
fuente
44
Recomendar a alguien exportar $ TERM realmente parece como frotar sal en una herida abierta ...
JasonWryan
1
sí. Supongo que los desarrolladores de gnome-terminal lo dejaron $TERMconfigurado xtermpor una buena razón
Mulllhausen
44
@mulllhausen Esa razón está bien explicada en mi respuesta ...
Patrick
27

La TERMvariable de entorno indica el tipo de terminal , no la aplicación de terminal . TERMtiene un propósito específico: le dice a las aplicaciones que se ejecutan en ese terminal cómo interactuar con el terminal.

Las aplicaciones interactúan con los terminales al escribir secuencias de escape: secuencias de caracteres que incluyen caracteres no imprimibles y tienen efectos como mover el cursor, borrar parte de la pantalla, cambiar el color actual, etc. En los viejos tiempos, diferentes marcas de terminales físicos tenían diferentes conjuntos de secuencias de escape. Por lo tanto, el sistema operativo mantiene una base de datos de tipos de terminales y sus características. La base de datos tradicional es termcap ("capacidades finales"); Muchos sistemas y aplicaciones modernos han cambiado a Terminfo . Ambas bases de datos están indexadas por el nombre del tipo de terminal, y las aplicaciones las consultan utilizando el nombre del tipo de terminal de las TERMvariables de entorno.

Hoy en día, la mayoría de los terminales utilizan un conjunto estándar de secuencias de escape con algunos conjuntos comunes de extensiones, por lo que no verá muchos valores diferentes de TERM. La mayoría de los emuladores de terminal GUI son compatibles con xterm , el terminal X tradicional (que todavía se usa y mantiene).

Los emuladores de terminal que difieren de xterm pueden agregar su propia entrada a la base de datos del terminal con su propio nombre. Sin embargo, esto no encaja bien con los proyectiles remotos. Un programa que se ejecuta en la máquina A pero que se muestra en la máquina B, por ejemplo, porque se lanzó a través de ssh de B a A, necesita consultar la base de datos del terminal en la máquina A. Los métodos de inicio de sesión remoto, como ssh, transfieren la TERMvariable de entorno, pero esto es útil solo cuando la base de datos de terminales de B también tiene una entrada para el usuario de valor en A. Por lo tanto, muchos emuladores de terminales se adhieren a lo TERM=xtermque es casi universalmente conocido.

La diferenciación entre terminales en general no proviene de la forma en que las aplicaciones interactúan con ellos, sino de la forma en que los terminales interactúan con el usuario y se ajustan a su entorno. Por ejemplo, Gnome Terminal se ve bien en Gnome y proporciona pestañas y otras sutilezas; Konsole se ve bien en KDE y proporciona pestañas y otras sutilezas; urxvt tiene un pequeño requisito de memoria; Console2 se ejecuta en Windows; screen y tmux proporcionan sesiones que se pueden conectar a diferentes terminales principales; y así. Dado que ninguna de estas características hace una diferencia en las aplicaciones que se ejecutan en el terminal, la mayoría de los emuladores de terminal utilizan TERM=xterm.

Para averiguar en qué terminal lo está ejecutando un shell, mire el padre del shell:

ps -p$PPID
Gilles 'SO- deja de ser malvado'
fuente
Ejecutar ps -p$PPIDno parece decirme qué terminal estoy ejecutando. O al menos no de una manera que entiendo. ¿Tienes un ejemplo de salida / respuesta?
user3731622
@user La salida es un conjunto de números y abreviaturas crípticas seguidas de una línea de comando. En la mayoría de los casos, la línea de comando es la que inició el emulador de terminal en el que se ejecuta el shell.
Gilles 'SO- deja de ser malvado'
12

La variable de entorno TERM no significa el terminal que está utilizando.

Citando a gnu.org :

La variable de entorno TERM contiene un identificador para las capacidades de la ventana de texto. Puede obtener una lista detallada de estas capacidades utilizando el comando> 'infocmp', usando 'man 5 terminfo' como referencia.

Al producir texto con directivas de color incrustadas, msgcat mira la variable TERM. Las ventanas de texto de hoy en día suelen admitir al menos 8 colores. Sin embargo, a menudo, la ventana de texto admite 16 o más colores, aunque la variable TERM esté configurada en un identificador que denota solo 8 colores admitidos. Puede valer la pena establecer la variable TERM en un valor diferente en estos casos:

xterm en la mayoría de los casos está construido con soporte para 16 colores. También se puede construir con soporte para 88 o 256 colores (pero no para ambos). Puede intentar configurar TERM en xterm-16color, xterm-88color o xterm-256color. rxvt

rxvt a menudo se construye con soporte para 16 colores. Puede intentar configurar TERM en rxvt-16color. konsole

Konsole también se construye a menudo con soporte para 16 colores. Puede intentar configurar TERM en konsole-16color o xterm-16color.

Después de configurar TERM, puede verificarlo invocando 'msgcat --color = test' y ver si el resultado parece un mapa de color razonable. La variable de entorno TERM contiene un identificador para las capacidades de la ventana de texto. Puede obtener una lista detallada de estas cababilidades usando el comando 'infocmp', usando 'man 5 terminfo' como referencia.

mavillan
fuente