
Cuando uso clear
el 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)
Entonces duplico el comando para obtener el comportamiento correcto:
$ clear && clear && DD=0 ...
¿Por qué necesito duplicar el comando para borrar la pantalla?
UPD
En realidad, si simplemente clear
borrara la pantalla. Pero puedo desplazarme hacia arriba y ver las últimas 25 líneas (si la pantalla es de 80x25). Cuando corro, clear;clear
borré 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.
- El
clear
comando analiza terminfo/termcap y emite secuencias de control apropiadas.- Si la entrada terminfo/termcap tiene una
E3
capacidad, 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 elclear
comando. - Luego utiliza la
clear
capacidad de borrar la pantalla visible.
- Si la entrada terminfo/termcap tiene una
- 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:
- La
putty
entradadefineE3=\E[3J
cuál es la secuencia de control de la extensión Xterm. pcvtxx
La entrada de la consola NetBSDEs uno de los muchos que definenclear=\E[H\E[J
o algo similar. Se trata de dos secuencias de control ECMA-48 ordinarias.
- La
- 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 CSIJ
borra 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.
- CSI
Cuando se trata de GNOME Terminal en particular:
- El tipo de terminal es el correcto
gnome
, pero algunas personas lo dejan configurado erróneamente enxterm
. - La
gnome
entrada terminfono define unaE3
capacidad y, en muchos sistemas, ¡todavía! — tampoco laxterm
entrada, ya que no se ha filtrado desdeInformación sobre términos de Dickey. Entoncesclear
simplemente escribe el contenido de laclear
capacidad. - El contenido de la
clear
capacidad para esas entradas de terminfo son las secuencias de control para colocar el cursor en casa y luego borrar toda la pantalla. - 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 clear
comando 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
- Funciones de control para juegos de caracteres codificados. ECMA-48. 1976.
- Georgi Kirilov (30 de diciembre de 2007).Ctrl-L agrega espacio en blanco al búfer de desplazamiento hacia atrás. Error de GNOME n.º 506438.
- ¿Hasta qué punto los emuladores de terminal xterm, xterm-color y Linux se basan en VT100?
- Borrar el búfer de desplazamiento hacia atrás "antiguo"
- El comportamiento extraño del comando Bash clear elimina el búfer de desplazamiento hacia atrás.
- https://superuser.com/questions/1094599/
- Thomas Dickey (2018). "Errores conocidos en XTerm y similares: Terminal GNOME". Preguntas frecuentes sobre XTerm. isla-invisible.net.
- Thomas Dickey (2018). "Errores conocidos en XTerm y similares: notas sobre VTE". Preguntas frecuentes sobre XTerm. isla-invisible.net.
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, tput
debe 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 reset
lo define POSIX, también debería funcionar en cualquier sistema compatible con POSIX:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html