¿Cómo y dónde se interpreta $ TERM?

9

Me pregunto cómo funciona algo de magia terminal internamente.

Mientras jugaba con los contenedores acoplables, la variable de entorno $TERMno se estableció. Esto condujo a aplicaciones de consola de aspecto extraño como vim y tmux, pero también a que se ignorara CTRL + l (pantalla clara).

Estoy bastante seguro de que todas las funciones, como las actualizaciones parciales de pantalla, los colores, los comandos como el restablecimiento de pantalla, etc., se realizan mediante códigos de escape, ¿verdad?

Entonces, ¿dónde se interpreta esta variable y permite, por ejemplo, restablecer la pantalla de mi terminal usando CTRL + l si configuro el valor correcto allí? ¿Quién comprueba, por ejemplo, qué colores son compatibles (xterm vs xterm-256color)? ¿La cáscara? ¿La aplicación o una biblioteca como ncurses? ¿Y dónde se definen los posibles valores / tipos de terminal?

muffel
fuente

Respuestas:

8

$TERMes leído e interpretado por el sistema terminfo. terminfo también se refiere a la base de datos de descripciones de terminales que puede encontrar en la mayoría de los sistemas /usr/share/terminfo. $TERMdebe coincidir con una de las entradas en esa base de datos. También había una biblioteca más antigua llamada termcap que tenía menos capacidades, pero terminfo la reemplazó. En los sistemas modernos, terminfo es parte de la biblioteca ncurses.

Las aplicaciones generalmente obtienen capacidades de terminal directamente usando funciones de biblioteca como tigetstr()o usan interfaces de maldiciones de nivel superior para administrar el diseño de la pantalla. De cualquier manera, $TERMse consultará la base de datos terminfo.

Celada
fuente
5

La TERMvariable es interpretada por cada aplicación, a través de las bibliotecas del sistema. Su valor es un nombre que se busca en una base de datos. Dependiendo del sabor de Unix y su antigüedad, la base de datos puede ser termcap (tradicional, no se usa mucho hoy en día) o terminfo (moderna, en la medida en que se pensó como una mejora en termcap, y utilizada por la mayoría de los sistemas hoy en día).

Tanto las bases de datos termcap como terminfo asocian nombres de capacidades con valores. Las capacidades son descripciones de lo que puede hacer el terminal (número de líneas, capacidad de subrayar, etc.) o cadenas que se pueden intercambiar con el terminal (secuencias de escape para formatear texto, mover el cursor, etc., y en el otro secuencias de escape de dirección enviadas por teclas de función). Puede mirar man 5 termcapy man 5 terminfover qué capacidades se conocen en su sistema.

Por ejemplo, cuando presiona Ctrl+ Lpara volver a dibujar la pantalla, lee las capacidades en la base de datos del terminal para descubrir qué secuencias de escape debe usar para mover el cursor. Si TERMno está configurado o está configurado incorrectamente, la pantalla no tiene forma de saber cómo mover el cursor.

Puede usar el tputcomando para recuperar entradas en la base de datos terminfo. Por ejemplo, tput linesimprime el número de líneas en el terminal. tput clearborra la pantalla (porque su salida se imprime en el terminal); para ver cuál es la secuencia de escape correspondiente, imprímala en una forma legible, por ejemplo tput clear | cat -v.

El número de colores tiene un poco de historia que hace que no funcione como debería por derecho: los emuladores de terminal tienden a informar de menos su número de colores, para evitar romper algunas aplicaciones. Consulte tmux, TERM y 256 colores para obtener más información sobre esto, especialmente en el contexto de tmux. La diferencia entre xterm-256colorsy xtermes que el primero reporta 256 colores en terminfo mientras que el segundo reporta el 8 tradicional.

Gilles 'SO- deja de ser malvado'
fuente
2

TERM, por convención se refiere a una descripción de terminal. Originalmente, esto nombró una sección de un archivo de texto termcap (a partir de finales de la década de 1970). A mediados de la década de 1980, terminfo se introdujo como un archivo compilado (binario) que ahorraba tiempo al obtener la descripción del terminal. Si bien ambos están disponibles para todas las plataformas similares a Unix, termcap rara vez se usa hoy en día, excepto como una emulación que usa terminfo.

Para ambos formatos de datos, las aplicaciones generalmente extraen datos de la base de datos del terminal con bibliotecas de programación reutilizables. La biblioteca de programación terminfo generalmente es parte de la biblioteca de curses de nivel superior, aunque puede proporcionarse (por ejemplo, opcionalmente como ncurses) como un archivo de biblioteca separado. Si la biblioteca terminfo se proporciona por separado o no, en estos casos se considera parte de la biblioteca curses. (También hay algunas otras bibliotecas de nivel superior, como la jerga).

La entrada de la base de datos de terminales para cada terminal contiene propiedades denominadas capacidades . Le dicen a la biblioteca de maldiciones (o aplicaciones que usan termcap / terminfo directamente) cómo realizar operaciones útiles, como limpiar la pantalla. Para la mayoría de las terminales, es una secuencia de escape. Algunos terminales pueden no admitir una secuencia de escape para este propósito; Hay otras capacidades que pueden combinarse con la biblioteca curses para borrar la pantalla (como borrar cada línea). No todas las capacidades son secuencias de escape. También hay capacidades booleanas y numéricas , por ejemplo, para saber si una característica es compatible y qué tan grande es algo (como el tamaño de la pantalla).

Cada aplicación que usa termcap / terminfo usa la biblioteca correspondiente para recuperar la descripción del terminal, así como para realizar operaciones tales como la sustitución de parámetros en ciertas capacidades. Por ejemplo, la mayoría de los terminales ofrecen la capacidad de mover el cursor en un número determinado de columnas o filas desde su ubicación actual. Las funciones tparm(o tiparm) sustituyen el número en la capacidad de obtener la secuencia de escape real.

La biblioteca curses tiene aplicaciones de línea de comandos que mantienen la base de datos del terminal ( tic , infocmp ) y algunas que se utilizan en scripts de shell para consultar la base de datos del terminal o realizar operaciones de bajo nivel con capacidades de terminal ( tput , tset / reset ).

Hay aplicaciones no convencionales que se usan TERMsin usar la base de datos del terminal. La mayoría de estos simplemente codifican su comportamiento (como GNU grep, groff y los enlaces / links2 / elinks navegadores web textuales), mientras que algunos tienen lo que equivale a su propia base de datos de terminal (como GNU ls), pero usan diferentes reglas y comportamiento.

Volver a la (s) pregunta (s):

  • Entonces, ¿dónde se interpreta esta variable y permite, por ejemplo, restablecer la pantalla de mi terminal usando CTRL + l si configuro el valor correcto allí?

    La aplicación y las bibliotecas subyacentes interpretan este valor. Para controlL, eso se puede hacer para bash en la biblioteca readline (que usa una interfaz de programación termcap).

  • ¿Quién comprueba, por ejemplo, qué colores son compatibles (xterm vs xterm-256color)?

    La base de datos del terminal almacena el número de colores como una capacidad, junto con las capacidades para configurar los colores de primer plano y de fondo y restablecer los colores. Algunas aplicaciones combinan estas capacidades con otra información (como la afirmación de un desarrollador que xtermes "realmente" xterm-256color).

  • ¿La cáscara?

    La mayoría de los shells usan una interfaz de programación termcap para obtener la información del terminal. Sin embargo, son aplicaciones que tienen su propio comportamiento (no necesariamente lo mismo que las maldiciones).

  • ¿La aplicación o una biblioteca como ncurses?

    (ver arriba: los shells son un tipo particular de aplicación)

  • ¿Y dónde se definen los posibles valores / tipos de terminal?

    Por lo general, se encuentra en una base de datos de terminal compartida por aplicaciones que usan las bibliotecas curs o slang. Algunas aplicaciones están codificadas o usan una base de datos privada.

Otras lecturas:

Thomas Dickey
fuente