Me preguntaba cómo se comunica la "GUI" de una aplicación de línea de comandos a través de una red. La mayoría de las veces, es bastante simple (texto sin formato/entrada), pero a veces es más complejo (aptitud).
¿Está definido por algún tipo de estándar para que cualquiera pueda escribir su propia terminal y que todas las implementaciones de terminales se comporten de la misma manera (colores, posicionamiento, etc.)?
Respuesta aceptada:
Los programas de consola generalmente usan curses o uno de sus sucesores¹ para crear el tipo de interfaces de usuario de texto de las que está hablando.
Estas bibliotecas usan una de dos bases de datos, llamadas termcap
y terminfo
.² Estas bases de datos contienen mapas que le indican a la biblioteca qué códigos enviar para obtener las acciones deseadas con una gran cantidad de diversos tipos de terminales. La gran mayoría de los tipos de terminales que encontrará definidos en estas bases de datos no sobrevivieron a los días de los terminales reales, por lo que ahora solo tienen un interés histórico.
Terminales ANSI
Los modernos emuladores de terminales Unix³ utilizan el protocolo ANSI X3.64 o una de sus variantes posteriores:
-
ANSI X3.64 :Un estándar para controlar “terminales de vidrio” —a diferencia de los teletipos— se basa en secuencias especiales de caracteres que interpreta el terminal remoto. Por ejemplo, si la caja de Unix quiere decirle a un terminal compatible con ANSI X3.64 que mueva el cursor a la esquina superior izquierda de la pantalla, envía los caracteresESC
[
1
;
1
H
. Los primeros dos caracteres le dicen al terminal que espere una secuencia de control, los 1 son la fila y la columna, yH
es el comando que significa “mover cursor”.⁴Trivia:muchos PC BBS también usaban códigos ANSI. (Todavía lo hago, en realidad.)
-
DEC VT100 :El primer terminal de vidrio compatible con ANSI muy popular fue el VT100 de Digital Equipment Corporation. Al probar el de jure de ANSI estándar en el mercado, estableció un de facto estándar que sigue siendo importante hoy en día.
A veces verá esto llamado protocolo VT102, que es una versión posterior de costo reducido y, por lo tanto, más popular, del VT100 más todas las opciones de expansión disponibles incorporadas.
Los protocolos de terminal DEC son una serie compatible con versiones anteriores, que van desde el primer modelo compatible con ANSI presentado en 1978 (el VT100) hasta los modelos de la serie VT500 producidos por Boundless Technologies después de que compraron el negocio de terminales de DEC en 1995. (Boundless es ahora fuera del negocio, pero sus terminales aún aparecen en el mercado usado de vez en cuando).
-
xtérmino :Una especie de amalgama de ANSI y los estándares VT-cualesquiera que sean. Siempre que esté utilizando un emulador de terminal GUI como
xterm
o uno de sus derivados, generalmente también está usando elxterm
protocolo de terminal, típicamente el más modernoxterm-color
oxterm-color256
variantes. -
Linux :La consola de Linux también usa una variante extendida del protocolo de terminal ANSI, en el mismo espíritu que elxterm
protocolos La mayoría de sus extensiones tienen que ver con las diferencias entre un PC y un terminal de cristal. Por ejemplo, el teclado IBM tiene algunas teclas que no están en un DEC VT, lo que sea. (Y viceversa.)Algunos sistemas Unix también tienen su propio protocolo de terminal de consola. Ahí está el
scoansi
Variante ANSI X3.64 para SCO Unixes, por ejemplo.
Un programa emulador de terminal típico es algo así como un mestizo, y no emula ningún modelo de terminal exactamente. Puede admitir el 96 % de todas las secuencias de escape de DEC VT hasta el VT320, pero también admite extensiones como el color ANSI (una característica de VT525) y un número arbitrario de filas y columnas. El 4 % de los códigos que no comprende puede no pasarse por alto si sus programas no necesitan esas funciones, aunque le haya dicho a curses
(o lo que sea) que desea que los programas lo usen para usar el protocolo VT320. Dicho programa podría anunciarse como compatible con VT320, aunque, estrictamente hablando, no lo sea.⁵
Terminales no ANSI
Hay algunos otros estándares notables con los que todavía te encuentras a veces:
-
Wyse :Wyse, uno de los primeros productores independientes de terminales de vidrio, comenzó a fabricar terminales a principios de la década de 1980, antes de que la informática de estaciones de trabajo comenzara a desplazar a las minicomputadoras. Aunque los terminales Wyse podían emular el VT100 y otros protocolos de terminales populares, también tenían sus propios códigos nativos.
-
IBM 3270 :Aunque no se trata estrictamente de un tipo de terminal "Unix", la necesidad de conectar los sistemas Unix a los mainframes de IBM condujo a la creación de programas de emulación de terminal de la serie IBM 3270, que todavía se pueden encontrar en uso. Los emuladores para las últimas terminales de la serie IBM 5250 también son bastante comunes, y se usan con mayor frecuencia en la actualidad para conectarse a minicomputadoras AS/400 y System i. -
Tektronix 4014 :antes de que las PC y las estaciones de trabajo desplazaran en gran medida a los terminales de vidrio y, por lo tanto, hicieran de los gráficos de mapa de bits una función estándar, había terminales gráficos costosos que dibujaban gráficos en la pantalla en respuesta a comandos de texto similares a las secuencias de escape descritas anteriormente. Probablemente el más popular de estos fue la serie Tektronix 4010.Fueron bastante divertidos de usar. Podría escribir un programa que dibujara un gráfico, pero luego, en lugar de simplemente ejecutarlo para dibujar en su terminal local, podría redirigir su salida a un archivo:
$ ./my4014program > my-neat-graphic
Luego podría enviar ese archivo a otra persona, y ellos podrían
cat
en su terminal Tek para ver el gráfico sin tener su programa. Parte del encanto era lo lentos que eran estos terminales para dibujar, por lo que podías ver cómo se acumulaba el gráfico durante varios segundos.
Trabajando con la emulación de terminal Unix hoy
Puede averiguar qué estándar de terminal está solicitando bibliotecas como curses
para usar mirando el TERM
variable de entorno:
$ echo $TERM
xterm-color
Cuando ssh
a otro sistema, el TERM
La variable se transporta para que la caja Unix remota sepa cómo comunicarse con su terminal local.
Debido a que muchos de estos protocolos son variantes de ANSI X3.64, y debido a que los omnipresentes estándares de codificación de caracteres ASCII y UTF-8 se encargan de mucho más, un TERM
incorrecto La variable no suele ser catastrófica. Las cosas que tienden a fallar son las teclas extendidas como Inicio y Re Pág, Alt, cualquier combinación de teclas y funciones de visualización tipográfica como color, negrita, etc.
Notas al pie:
-
Más comúnmente, ncurses.
También hay competidores directos de las
curses
API, como S-Lang. -
AT&T promulgó
terminfo
como reemplazo deltermcap
de BSD base de datos, y tuvo un gran éxito en reemplazarlo, pero todavía hay programas que todavía usan el antiguotermcap
base de datos. Es una de las muchas diferencias entre BSD y AT&T que aún puede encontrar en los sistemas modernos.Mi caja de macOS no tiene
/etc/termcap
, pero tiene/usr/share/terminfo
, mientras que una instalación estándar de FreeBSD es al revés, aunque estos dos sistemas operativos suelen ser bastante similares a nivel de línea de comandos. -
minicom
,xterm
,mintty
, Terminal GNOME, Terminal.aplicación, etc. -
Los programas Unix correctamente escritos no emiten estas secuencias de escape directamente. En su lugar, usan una de las bibliotecas mencionadas anteriormente, diciéndole que "mueva el cursor a la posición (1,1)" o lo que sea, y la biblioteca emite los códigos de control de terminal necesarios en función de su
TERM
configuración de la variable de entorno. Esto permite que el programa funcione correctamente sin importar en qué tipo de terminal lo ejecutes. -
Los terminales de texto antiguos tenían muchas funciones extrañas que los programas no usaban mucho, por lo que muchos programas emuladores de terminales populares simplemente no implementan estas funciones. Las omisiones comunes son la compatibilidad con gráficos de seis y modos de texto de doble ancho/doble altura.
El mantenedor de
xterm
escribió un programa llamadovttest
para probar emuladores de terminales VT comoxterm
. Puede ejecutarlo contra otros emuladores de terminal para averiguar qué funciones no son compatibles.