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.
- Das
clearDer Befehl schaut auf terminfo/termcap und gibt entsprechende Steuersequenzen aus.- Wenn der terminfo/termcap-Eintrag einen
E3hat 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ürcleardokumentiert Befehl. - Es verwendet dann den
clearMöglichkeit, den sichtbaren Bildschirm zu löschen.
- Wenn der terminfo/termcap-Eintrag einen
- 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
puttyEintrag definiertE3=E[3Jdas ist die Steuersequenz der Xterm-Erweiterung. - Der
pcvtxxder NetBSD-Konsole Eintrag ist einer von vielen, dieclear=E[HE[Jdefinieren oder etwas ähnliches. Dies sind zwei gewöhnliche ECMA-48-Steuersequenzen.
- Der
- 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 CSIJlöscht von der aktuellen Cursorposition bis zum Ende des Bildschirms. - CSI
2J(ED 2) löscht den gesamten Bildschirm. - CSI
3J(ED 3) löscht den Scrollback-Puffer.
- CSI
Wenn es insbesondere um das GNOME-Terminal geht:
- Der Terminaltyp ist richtigerweise
gnome, aber einige Leute belassen es fälschlicherweise aufxterm. - Der
gnometerminfo-Eintrag definiert keinenE3Fähigkeit, und auf vielen Systemen – immer noch! —xtermauch nicht Eintrag, da dieser nicht von Dickey terminfo durchgesickert ist. Alsoclearschreibt einfach den Inhalt vonclearaus Fähigkeit. - Der Inhalt des
clearFähigkeit für diese Termininfo-Einträge sind die Steuersequenzen, um den Cursor zurückzusetzen, gefolgt von Löschen des gesamten Bildschirms. - 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.
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.