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
clear
Der Befehl schaut auf terminfo/termcap und gibt entsprechende Steuersequenzen aus.- 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ürclear
dokumentiert Befehl. - Es verwendet dann den
clear
Mö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
putty
Eintrag definiertE3=E[3J
das ist die Steuersequenz der Xterm-Erweiterung. - Der
pcvtxx
der NetBSD-Konsole Eintrag ist einer von vielen, dieclear=E[HE[J
definieren 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 CSIJ
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.
- CSI
Wenn es insbesondere um das GNOME-Terminal geht:
- Der Terminaltyp ist richtigerweise
gnome
, aber einige Leute belassen es fälschlicherweise aufxterm
. - Der
gnome
terminfo-Eintrag definiert keinenE3
Fähigkeit, und auf vielen Systemen – immer noch! —xterm
auch nicht Eintrag, da dieser nicht von Dickey terminfo durchgesickert ist. Alsoclear
schreibt einfach den Inhalt vonclear
aus Fähigkeit. - 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. - 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.