Cuando uso clear
Comando para borrar la pantalla. No se borra (vea la captura de pantalla cuando me desplazo un poco hacia arriba después de completar el comando)
Así que doblo 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
Tengo pantalla limpia. Pero puedo desplazarme hacia arriba y ver las últimas 25 líneas (si la pantalla es de 80 × 25). Cuando ejecuto clear;clear
Borré esas líneas.
Respuesta aceptada:
Lo importante a tener en cuenta aquí es la etiqueta en la pregunta. Este comportamiento es específico de GNOME Terminal y cualquier otro emulador de terminal que se base en 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 de FreeBSD.
Lo que sucede en general es esto.
- El
clear
El comando examina terminfo/termcap y emite las secuencias de control adecuadas.- Si la entrada terminfo/termcap tiene un
E3
capacidad, primero escribe eso. 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 en la página del manual de Dickey ncurses paraclear
comando. - Luego usa el
clear
capacidad para borrar la pantalla visible.
- Si la entrada terminfo/termcap tiene un
- Las secuencias de control en la entrada terminfo/termcap están determinadas por el tipo de terminal; pero, con la excepción de los (hoy en día raros) terminales que usan FormFeed para limpiar la pantalla (que no hacen los DEC VT y sus imitadores), son simplemente viejas secuencias de control ECMA-48 o extensiones de las mismas. Por ejemplo:
- La
putty
entrada defineE3=E[3J
que es la secuencia de control de la extensión Xterm. - El
pcvtxx
de la consola NetBSD entrada es una de las muchas que definenclear=E[HE[J
o algo similar. Estas son dos secuencias de control ordinarias de ECMA-48.
- La
- El emulador de terminal actúa sobre las secuencias de control. Tal como lo define ECMA-48 y la extensión Xterm:
- CSI
H
(CUP) ubica el cursor. - CSI
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 correctamente
gnome
, pero algunas personas lo dejan configurado erróneamente enxterm
. - El
gnome
la entrada terminfo no define unE3
y en muchos sistemas, ¡aún! — tampoco elxterm
entrada ya que esto no se ha filtrado desde Dickey terminfo. Así queclear
simplemente escribe el contenido delclear
capacidad. - El contenido del
clear
la capacidad para esas entradas terminfo son las secuencias de control para colocar el cursor en el hogar seguido de 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 de su
VteTerminalPrivate::seq_clear_screen()
función. Más bien, libvte desplaza la pantalla hacia abajo por el valor de una pantalla completa 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 ha hecho el interrogador 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 en 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 arriba en el búfer de desplazamiento hacia atrás y agrega el valor de una pantalla de líneas en blanco. El contenido de la pantalla anterior no se borra, sino que se traslada al búfer de desplazamiento hacia atrás.
Y si ejecuta el clear
comando dos veces, agrega dos el valor de la pantalla de líneas en blanco. Si su búfer de desplazamiento hacia atrás es lo suficientemente grande, puede todavía encuentre el contenido de la pantalla original, simplemente más arriba en el búfer de desplazamiento hacia atrás.
Lecturas adicionales
- Funciones de control para conjuntos de caracteres codificados . ECMA-48. 1976.
- Georgi Kirilov (2007-12-30). Ctrl-L agrega un 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 están basados 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://superusuario.com/questions/1094599/
- Thomas Dickey (2018). "Errores conocidos en XTerm y similares:GNOME Terminal". Preguntas frecuentes de XTerm . isla-invisible.net.
- Thomas Dickey (2018). "Errores conocidos en XTerm y similares:notas sobre VTE". Preguntas frecuentes de XTerm . isla-invisible.net.