GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum „löschen“ den ganzen Bildschirm nicht löschen?

Wenn ich clear verwende Befehl zum Löschen des Bildschirms. Es wird nicht gelöscht (siehe Screenshot, wenn ich etwas nach oben scrolle, nachdem der Befehl ausgeführt wurde)

Also verdopple ich den Befehl, um das richtige Verhalten zu bekommen:

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

Warum muss ich den Befehl verdoppeln, um den Bildschirm zu löschen?

UPD

Eigentlich, wenn ich nur clear Ich habe einen gelöschten Bildschirm. Aber ich kann nach oben scrollen und die letzten 25 Zeilen sehen (wenn der Bildschirm 80 × 25 ist). Wenn ich clear;clear ausführe Ich habe diese Zeilen gelöscht.

Akzeptierte Antwort:

Das Wichtige, was hier zu beachten ist, ist das Tag auf der Frage. Dieses Verhalten ist spezifisch für GNOME Terminal und alle anderen Terminalemulatoren, die auf libvte aufbauen. Sie werden dies nicht in Xterm oder in Unicode RXVT oder in dem in den Linux-Kernel integrierten Terminalemulator oder auf der FreeBSD-Konsole sehen.

Was im Allgemeinen passiert, ist Folgendes.

  1. Das clear Der Befehl schaut auf terminfo/termcap und gibt entsprechende Steuersequenzen aus.
    1. Wenn der terminfo/termcap-Eintrag einen E3 hat Fähigkeit es, schreibt es zuerst aus. Dies gibt Steuersequenzen aus, um den Scrollback-Puffer zu löschen. Dies und die Geschichte dahinter sind ausführlich in der Dickey ncurses-Manpage für clear dokumentiert Befehl.
    2. Es verwendet dann den clear Möglichkeit, den sichtbaren Bildschirm zu löschen.
  2. Die Steuersequenzen im terminfo/termcap-Eintrag werden durch den Terminaltyp bestimmt; aber mit Ausnahme der (heute seltenen) Terminals, die FormFeed verwenden, um den Bildschirm zu löschen (was DEC VTs und ihre Nachahmer nicht tun), sind sie entweder einfach nur alte ECMA-48-Steuersequenzen oder Erweiterungen davon. Zum Beispiel:
    • Der putty Eintrag definiert E3=E[3J das ist die Steuersequenz der Xterm-Erweiterung.
    • Der pcvtxx der NetBSD-Konsole Eintrag ist einer von vielen, die clear=E[HE[J definieren oder etwas ähnliches. Dies sind zwei gewöhnliche ECMA-48-Steuersequenzen.
  3. Der Terminal-Emulator wirkt auf die Steuersequenzen ein. Wie von ECMA-48 und der Xterm-Erweiterung dazu definiert:
    • CSI H (CUP) positioniert den Cursor.
    • CSI J (ED 0) oder einfach nur CSI J löscht von der aktuellen Cursorposition bis zum Ende des Bildschirms.
    • CSI 2 J (ED 2) löscht den gesamten Bildschirm.
    • CSI 3 J (ED 3) löscht den Scrollback-Puffer.

Wenn es insbesondere um das GNOME-Terminal geht:

  1. Der Terminaltyp ist richtigerweise gnome , aber einige Leute belassen es fälschlicherweise auf xterm .
  2. Der gnome terminfo-Eintrag definiert keinen E3 Fähigkeit, und auf vielen Systemen – immer noch! — xterm auch nicht Eintrag, da dieser nicht von Dickey terminfo durchgesickert ist. Also clear schreibt einfach den Inhalt von clear aus Fähigkeit.
  3. Der Inhalt des clear Fähigkeit für diese Termininfo-Einträge sind die Steuersequenzen, um den Cursor zurückzusetzen, gefolgt von Löschen des gesamten Bildschirms.
  4. Aber GNOME Terminal implementiert das Löschen des gesamten Bildschirms nicht korrekt. Genauer gesagt, die Bibliothek, auf der es basiert, libvte, tut dies nicht im Code seines VteTerminalPrivate::seq_clear_screen() Funktion. Stattdessen scrollt libvte den Bildschirm um einen ganzen Bildschirm voller leerer Zeilen nach unten und bewegt die Cursorposition auf die erste dieser leeren Zeilen.
Verwandte:Zu welchem ​​Spiel gehört dieser Screenshot, der eine Wildnisszene darstellt?

Deshalb siehst du, was du siehst. libvte löscht nicht den gesamten Bildschirm, wenn es dazu aufgefordert wird. Vielmehr tut es etwas, das eine oberflächliche Ähnlichkeit damit hat, bis man genau das tut, was der Fragesteller hier getan hat:Scrollen Sie das Terminalfenster zurück, um den Scroll-Back-Puffer zu sehen. Dann ist der Unterschied krass.

Bei anderen Terminalemulatoren wie Xterm und Unicode RXVT löscht die ED 2-Steuersequenz wirklich den Bildschirm, indem sie jede Position auf dem Bildschirm von oben nach unten löscht und den Scrollback-Puffer nicht ändert. Aber bei libvte-Terminal-Emulatoren schiebt es einfach den aktuellen Bildschirm nach oben in den Scrollback-Puffer und fügt Leerzeilen im Wert eines Bildschirms hinzu. Der vorherige Bildschirminhalt wird nicht gelöscht, sondern in den Scrollback-Puffer verschoben.

Und wenn Sie clear ausführen Befehl zweimal, fügt er zwei hinzu Bildschirm im Wert von Leerzeilen. Wenn Ihr Zurückscrollpuffer groß genug ist, können Sie immer noch finden Sie den ursprünglichen Bildschirminhalt, einfach weiter oben im Scrollback-Puffer.

Weiterführende Literatur

  • Steuerfunktionen für codierte Zeichensätze . ECMA-48. 1976.
  • Georgi Kirilow (2007-12-30). Strg-L fügt dem Scrollback-Puffer Leerzeichen hinzu . GNOME-Fehler #506438.
  • Inwieweit basieren die Terminalemulatoren xterm, xterm-color und linux auf VT100?
  • Löschen des „alten“ Scrollback-Puffers
  • Ungewöhnliches Verhalten des Bash-Clear-Befehls löscht den Scrollback-Puffer.
  • https://superuser.com/questions/1094599/
  • Thomas Dickey (2018). „Bekannte Fehler in XTerm und Look-alikes:GNOME Terminal“. Häufig gestellte Fragen zu XTerm . unsichtbare-insel.net.
  • Thomas Dickey (2018). „Bekannte Fehler in XTerm und Look-Alikes:Hinweise zu VTE“. Häufig gestellte Fragen zu XTerm . unsichtbare-insel.net.

Linux
  1. Warum ist Cd kein Programm?

  2. Linux – Warum verwenden wir Su – und nicht nur Su?

  3. Warum ist Nullglob kein Standard?

  4. Warum akzeptiert Find „-exec Cp {} Dir +“ nicht?

  5. Linux – Warum funktioniert Setuid nicht?

So löschen Sie das Terminal unter Linux {Bildschirm in Linux löschen}

Warum sehe ich MSG_EOR für SOCK_SEQPACKET unter Linux nicht?

warum funktioniert sftp rmdir nicht?

wie man weniger Pager dazu bringt, auf das Scrollrad zu reagieren und den Bildschirm nicht zu löschen

Warum verwenden wir su - und nicht nur su?

Warum nicht ICMP blockieren?