GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué `clear` no borra toda la pantalla?

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.

  1. El clear El comando examina terminfo/termcap y emite las secuencias de control adecuadas.
    1. 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 para clear comando.
    2. Luego usa el clear capacidad para borrar la pantalla visible.
  2. 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 define E3=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 definen clear=E[HE[J o algo similar. Estas son dos secuencias de control ordinarias de ECMA-48.
  3. 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 CSI J 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.

Cuando se trata de GNOME Terminal en particular:

  1. El tipo de terminal es correctamente gnome , pero algunas personas lo dejan configurado erróneamente en xterm .
  2. El gnome la entrada terminfo no define un E3 y en muchos sistemas, ¡aún! — tampoco el xterm entrada ya que esto no se ha filtrado desde Dickey terminfo. Así que clear simplemente escribe el contenido del clear capacidad.
  3. 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.
  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 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.
Relacionado:¿A qué juego pertenece esta captura de pantalla que representa una escena salvaje?

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.

Linux
  1. ¿Por qué Ctrl-L no borra la pantalla en Bash? ¿Cómo vincular claves en Linux?

  2. ¿Cómo borrar el desplazamiento hacia atrás en el comando de pantalla?

  3. ¿Por qué no veo MSG_EOR para SOCK_SEQPACKET en Linux?

  4. ¿Por qué usamos su - y no solo su?

  5. ¿Por qué borrar el historial de bash no es suficiente?

¿Por qué Cd no es un programa?

Linux:¿por qué usamos Su y no solo Su?

¿Por qué Find no acepta '-exec Cp {} Dir +'?

¿El comando de suspensión usando el comando de pantalla no se muestra en Ps?

Cómo borrar la terminal en Linux {Borrar pantalla en Linux}

¿Por qué no bloquear ICMP?