Otras lecturas

Otras lecturas

Cuando uso clearel comando para borrar la pantalla. No se borra (ver captura de pantalla cuando me desplazo un poco hacia arriba después de realizar el comando)

ingrese la descripción de la imagen aquí

Entonces duplico el comando para obtener el comportamiento correcto:

$ clear && clear && DD=0 ...

ingrese la descripción de la imagen aquí

¿Por qué necesito duplicar el comando para borrar la pantalla?

UPD

En realidad, si simplemente clearborrara la pantalla. Pero puedo desplazarme hacia arriba y ver las últimas 25 líneas (si la pantalla es de 80x25). Cuando corro, clear;clearborré esas líneas.

Respuesta1

Lo importante a tener en cuenta aquí es la etiqueta de la pregunta. Este comportamiento es específico de GNOME Terminal y de cualquier otro emulador de terminal creado sobre libvte. No verá esto en Xterm, ni en Unicode RXVT, ni en el emulador de terminal integrado en el kernel de Linux, ni en la consola FreeBSD.

Lo que sucede en general es esto.

  1. El clearcomando analiza terminfo/termcap y emite secuencias de control apropiadas.
    1. Si la entrada terminfo/termcap tiene una E3capacidad, primero la escribe. Esto emite secuencias de control para borrar el búfer de desplazamiento hacia atrás. Esto y la historia detrás de esto están documentados en detalle enla página del manual de Dickey ncurses para el clearcomando.
    2. Luego utiliza la clearcapacidad de borrar la pantalla visible.
  2. Las secuencias de control en la entrada terminfo/termcap están determinadas por el tipo de terminal; pero, con las excepciones de los terminales (hoy en día raros) que usan FormFeed para borrar la pantalla (que los DEC VT y sus imitadores no hacen), son simplemente viejas secuencias de control ECMA-48 o extensiones de las mismas. Por ejemplo:
  3. El emulador de terminal actúa sobre las secuencias de control. Según lo definido por ECMA-48 y su extensión Xterm:
    • CSI H(CUP) coloca el cursor en casa.
    • CSI 0 J(ED 0) o simplemente CSI Jborra desde la posición actual del cursor hasta el final de la pantalla.
    • CSI 2 J(ED 2) borra toda la pantalla.
    • CSI 3 J(ED 3) borra el búfer de desplazamiento hacia atrás.

Cuando se trata de GNOME Terminal en particular:

  1. El tipo de terminal es el correcto gnome, pero algunas personas lo dejan configurado erróneamente en xterm.
  2. La gnomeentrada terminfono define una E3capacidad y, en muchos sistemas, ¡todavía! — tampoco la xtermentrada, ya que no se ha filtrado desdeInformación sobre términos de Dickey. Entonces clearsimplemente escribe el contenido de la clearcapacidad.
  3. El contenido de la clearcapacidad para esas entradas de terminfo son las secuencias de control para colocar el cursor en casa y luego borrar toda la pantalla.
  4. Pero GNOME Terminal no implementa el borrado de toda la pantalla correctamente. Más específicamente, la biblioteca en la que se basa, libvte, no hace eso en el código desu VteTerminalPrivate::seq_clear_screen()función. Más bien, libvte desplaza la pantalla hacia abajo a lo largo de una pantalla entera de líneas en blanco y mueve la posición del cursor a la primera de esas líneas en blanco.

Por eso ves lo que ves. libvte no borra toda la pantalla cuando se le indica. Más bien, está haciendo algo que tiene un parecido superficial con eso, hasta que uno hace exactamente lo que el autor de la pregunta ha hecho aquí: desplazar la ventana del terminal hacia atrás para ver el búfer de desplazamiento hacia atrás. Entonces la diferencia es flagrante.

En otros emuladores de terminal como Xterm y Unicode RXVT, la secuencia de control ED 2 realmente borra la pantalla, borrando cada posición de la pantalla en su lugar, de arriba hacia abajo, y sin alterar el búfer de desplazamiento hacia atrás. Pero en los emuladores de terminal libvte, simplemente empuja la pantalla actual hacia el búfer de desplazamiento hacia atrás y agrega líneas en blanco equivalentes a una pantalla. El contenido de la pantalla anterior no se borra, sino que se desplaza al búfer de desplazamiento hacia atrás.

Y si ejecuta el clearcomando dos veces, agregadosel valor de líneas en blanco de la pantalla. Si su búfer de desplazamiento hacia atrás es lo suficientemente grande, puedeaúnbusque el contenido original de la pantalla, simplemente más arriba en el búfer de desplazamiento hacia atrás.

Otras lecturas

Respuesta2

Si desea borrar la terminal y destruir todo el búfer de salida, le recomiendo hacer tput reset. Esto definitivamente limpiará el terminal y arreglará su estado como beneficio adicional si, por ejemplo, algún programa anterior fallara y dejara el terminal en estado sucio. Además, tputdebe ser lo suficientemente inteligente como para determinar el tipo de terminal correcto, de modo que no necesite saber si su terminal usa VT100 o alguna otra secuencia de comandos.

Como tput resetlo define POSIX, también debería funcionar en cualquier sistema compatible con POSIX:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html

información relacionada