¿Cómo funcionan los comandos como la salida de actualización superior sin agregarlos en la consola?

¿Cómo funcionan los comandos como la salida de actualización superior sin agregarlos en la consola?

Me conecto a servidores Linux remotos usando SSH a través del emulador de terminal PuTTY. Noto que los comandos que ejecuto y la salida en la consola siguen agregándose en la ventana de la terminal. Quiero decir, cuando uso la barra de desplazamiento y me desplazo hacia arriba/abajo, puedo ver los comandos anteriores que ejecuté y su resultado, como en un papel impreso. Sin embargo, algunos comandos, como topactualizar constantemente la salida, no aparecen como agregados en la consola. ¿Como funciona?

Respuesta1

Hay potencialmente dos mecanismos en juego aquí.

Uno es el uso de códigos de escape ANSI (y otros códigos que no son ANSI en algunos casos), como lo menciona Martin Prikryl en su respuesta, para implementar una interfaz pseudográfica basada en texto. Lo mínimo para esto son exactamente dos códigos de escape ANSI específicos, ^[[2Jque borra todo lo que aparece en la pantalla y ^[[;Hque mueve el cursor a la parte superior izquierda de la pantalla. Al combinarlos, puede escribir el contenido de cada 'cuadro' uno por uno sin agregarlo al búfer de desplazamiento hacia atrás. La mayoría de las aplicaciones en realidad usan mucho más que eso (por ejemplo, hay un conjunto de códigos para mover el cursor en direcciones arbitrarias, y es bastante normal usarlos para omitir partes de la pantalla que deberían estar "vacías"). En la práctica, la mayoría (pero no todas) las aplicaciones más grandes utilizan libcurses (o más a menudo, ncurses) o un equivalente directo para manejar todo esto por ellas.

La otra posibilidad, que generalmente se combina con el uso de códigos de escape ANSI para manipular el contenido de la pantalla, es una característica especial originalmente proporcionada por xterm, pero ahora ampliamente implementada por la mayoría de los emuladores de terminales decentes, llamada buffer de pantalla alternativo. Hay un par de códigos de escape ( ^[[?1049hy ^[[1049l) que se utilizan para cambiar entre este y el búfer de desplazamiento hacia atrás normal. Al cambiar al búfer de pantalla alternativo antes de presentar una interfaz de usuario textual, los programas pueden evitar por completo alterar el búfer de retroceso, lo que no solo evita que usted pueda desplazarse sin tener que interceptar las pulsaciones de teclas que normalmente se desplazarían, sino que también permite que el programa haga cosas como le permite inspeccionar el contenido del terminal existente antes de que se ejecutara el programa (y hace que sea más fácil ver lo que estaba haciendo antes de abrir esa aplicación de pantalla completa).

Respuesta2

Lo que observas es producto de un desarrollo histórico.

Los primeros terminales interactivos eran fieles a Diosteletipos; máquinas de escribir esencialmente eléctricas conectadas a una línea telefónica. (Alguna vez te has preguntado por qué /dev/ttyse nombra como se nombra?) Podrías escribir un comando de texto (con, iirc, incluso alguna edición de línea básica e incómoda) y obtendrías una salida de texto.

Estos, por supuesto, sólo podían moverse de izquierda a derecha y de arriba hacia abajo. ¡Oh, espera, no es cierto! Podrían retroceder un carácter con Ctrl-H y escribirlo nuevamente, poniéndolo en negrita. He aquí, eso es lo quealgunos programas todavía lo hacenque dan formato al texto para impresoras. Los teletipos también tenían algunos códigos de control básicos como avance de línea, avance de formulario o campana.

El paso a una terminal basada en CRT era lógico, aunque sólo fuera para salvar los árboles. Pero desde entonces, todos y cada uno de los terminales (emuladores) ofrecen el funcionamiento básico de un teletipo: a menos que se indique lo contrario (con las famosas secuencias de escape), los códigos ASCII de 7 bits recibidos, incluidos los códigos de control básicos, se interpretan como los caracteres correspondientes o comandos y se muestran de izquierda a derecha, de arriba a abajo, comenzando en la posición actual del cursor que fue mantenida por el terminal.

Pero dado que los terminales más inteligentes eran capaces de mostrar caracteres en posiciones arbitrarias de línea/columna en la pantalla, todos tenían algún medio para hacerlo mediante programación, a través de secuencias de códigos de control, y los sistemas operativos estaban de una forma u otra configurados para usar las secuencias adecuadas. . Algunos programas, en particular editores, shells y otros programas interactivos orientados al usuario, como top, utilizan esta capacidad para controlar toda la pantalla.

La razón por la que este "modo visual" no es más común es que simplemente generar una secuencia lineal de caracteres sin "decoración" es enormemente versátil y, al mismo tiempo, suficiente para una amplia gama de resultados: puede imprimir datos tabulados que siguen siendo esencialmente una secuencia serial de caracteres con espacios en blanco (espacio, tabulación, nueva línea). Todo el ecosistema Unix/Linux con canalizaciones y dispositivos se basa en este paradigma. Le permite conectar "ladrillos de construcción" como buscar, grep, cortar, etc. y procesar información textual automáticamente. Eso sería completamente imposible si la salida se mezclara con comandos de posicionamiento y formato.

Respuesta3

La mayoría de los comandos simplemente imprimen líneas en la terminal. El cliente terminal simplemente imprime esas líneas como lo hacían las impresoras de líneas antiguas. El desplazamiento hacia atrás es una representación delpapel sin finsaliendo de la impresora.

Pero el cliente terminal (también conocido comoemuladores de terminales) puede hacer mucho más, incluidas cosas como mover un cursor por la pantalla y así permitir que el servidor (la aplicación remota) imprima en un punto arbitrario de la "pantalla del terminal". De eso nos hacen aplicaciones como top, , Midnight Commander, etc, para implementar una interfaz "GUI" de pantalla completa (en realidad unaviinterfaz TUI). Esas funciones avanzadas se implementan utilizandoCódigos de escape ANSI.

información relacionada