
Wenn ich clear
den Befehl verwende, um den Bildschirm zu löschen, wird er nicht gelöscht (siehe Screenshot, wenn ich nach Ausführung des Befehls ein wenig nach oben scrolle).
Also verdopple ich den Befehl, um das richtige Verhalten zu erhalten:
$ clear && clear && DD=0 ...
Warum muss ich den Befehl verdoppeln, um den Bildschirm zu löschen?
UPD
Eigentlich habe ich nur clear
den Bildschirm gelöscht. Aber ich kann nach oben scrollen und die letzten 25 Zeilen sehen (wenn der Bildschirm 80 x 25 ist). Beim Ausführen clear;clear
wurden diese Zeilen gelöscht.
Antwort1
Wichtig ist hier der Tag der Frage. Dieses Verhalten ist spezifisch für GNOME Terminal und alle anderen Terminalemulatoren, die auf libvte basieren. Sie werden dies weder in Xterm noch in Unicode RXVT, noch im in den Linux-Kernel integrierten Terminalemulator oder auf der FreeBSD-Konsole sehen.
Im Allgemeinen passiert Folgendes.
- Der
clear
Befehl betrachtet terminfo/termcap und gibt entsprechende Steuersequenzen aus.- Wenn der terminfo/termcap-Eintrag eine
E3
Fähigkeit hat, schreibt er diese zuerst aus. Dies gibt Steuersequenzen aus, um den Scrollback-Puffer zu löschen. Dies und die Geschichte dahinter sind ausführlich dokumentiert indie Dickey ncurses-Manpage für denclear
Befehl. - Anschließend nutzt es die
clear
Funktion zum Löschen des sichtbaren Bildschirms.
- Wenn der terminfo/termcap-Eintrag eine
- Die Steuersequenzen im Eintrag terminfo/termcap werden durch den Terminaltyp bestimmt. Mit Ausnahme der (heutzutage seltenen) Terminals, die FormFeed zum Löschen des Bildschirms verwenden (was bei DEC VTs und ihren Nachahmern nicht der Fall ist), handelt es sich dabei entweder um einfache alte ECMA-48-Steuersequenzen oder um Erweiterungen davon. Beispiele:
- Der
putty
EintrittdefiniertE3=\E[3J
, welche die Steuersequenz der Xterm-Erweiterung ist. pcvtxx
Der Eintrag der NetBSD-Konsoleist eine von vielen, dieclear=\E[H\E[J
etwas Ähnliches definieren. Dies sind zwei gewöhnliche ECMA-48-Steuersequenzen.
- Der
- Der Terminalemulator arbeitet mit den Steuersequenzen. Wie in ECMA-48 und der Xterm-Erweiterung dazu definiert:
- CSI
H
(CUP) setzt den Cursor in die Ausgangsposition. - CSI
0
J
(ED 0) oder 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
Insbesondere wenn es um das GNOME-Terminal geht:
- Der Terminaltyp ist korrekt
gnome
, manche Leute lassen ihn jedoch fälschlicherweise auf eingestelltxterm
. - Der
gnome
Terminfo-Eintragdefiniert keineE3
Fähigkeit, und auf vielen Systemen — immer noch! — tut dies auch derxterm
Eintrag nicht, da dies nicht durchgesickert ist vonDickey-Terminologie.clear
Schreibt also einfach den Inhalt derclear
Fähigkeit aus. - Der Inhalt der
clear
Funktion für diese Terminfo-Einträge sind die Steuersequenzen zum Positionieren des Cursors und anschließenden Löschen des gesamten Bildschirms. - Das Löschen des gesamten Bildschirms wird vom GNOME-Terminal jedoch nicht korrekt implementiert. Genauer gesagt, die Bibliothek, auf der es basiert, libvte, tut das nicht im Code vonseine
VteTerminalPrivate::seq_clear_screen()
Funktion. Stattdessen scrollt libvte den Bildschirm um die gesamte Bildschirmlänge voller Leerzeilen nach unten und verschiebt die Cursorposition auf die erste dieser Leerzeilen.
Deshalb sehen Sie, was Sie sehen. libvte löscht nicht den gesamten Bildschirm, wenn man es anweist. Vielmehr tut es etwas, das oberflächlich ähnlich ist, bis man genau das tut, was der Fragesteller hier getan hat: das Terminalfenster zurückscrollen, um den Scrollback-Puffer anzuzeigen. Dann ist der Unterschied offensichtlich.
Bei anderen Terminalemulatoren wie Xterm und Unicode RXVT löscht die Steuersequenz ED 2 tatsächlich den Bildschirm, wobei jede Position auf dem Bildschirm von oben nach unten gelöscht wird und der Scrollback-Puffer nicht verändert wird. Bei libvte-Terminalemulatoren schiebt sie jedoch nur den aktuellen Bildschirm in den Scrollback-Puffer und fügt eine Bildschirmgröße mit leeren Zeilen hinzu. Der vorherige Bildschirminhalt wird nicht gelöscht, sondern in den Scrollback-Puffer verschoben.
Und wenn Sie den clear
Befehl zweimal ausführen, fügt er hinzuzweiBildschirm voller leerer Zeilen. Wenn Ihr Scrollback-Puffer groß genug ist, können SieTrotzdemUm den ursprünglichen Bildschirminhalt wieder zu finden, müssen Sie einfach weiter oben im Scrollback-Puffer nach oben scrollen.
Weiterführende Literatur
- Kontrollfunktionen für codierte Zeichensätze. ECMA-48. 1976.
- Georgi Kirilow (30.12.2007).Strg-L fügt dem Scrollback-Puffer Leerraum hinzu. GNOME-Fehler Nr. 506438.
- Inwieweit basieren die Terminalemulatoren xterm, xterm-color und Linux auf VT100?
- Löschen des „alten“ Scrollback-Puffers
- Das seltsame 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. invisible-island.net.
- Thomas Dickey (2018). "Bekannte Fehler in XTerm und ähnlichen Versionen: Hinweise zu VTE". Häufig gestellte Fragen zu XTerm. invisible-island.net.
Antwort2
Wenn Sie das Terminal löschen und den gesamten Ausgabepuffer zerstören möchten, empfehle ich Ihnen, Folgendes zu tun tput reset
. Dadurch wird das Terminal definitiv gelöscht und sein Zustand als Bonus repariert, wenn beispielsweise ein vorheriges Programm abgestürzt ist und das Terminal in einem unsauberen Zustand hinterlassen hat. Darüber hinaus tput
sollte das intelligent genug sein, um den richtigen Terminaltyp herauszufinden, sodass Sie nicht wissen müssen, ob Ihr Terminal VT100 oder andere Befehlssequenzen verwendet.
Gemäß tput reset
der POSIX-Definition sollte es auch in jedem POSIX-kompatiblen System funktionieren:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html