Weiterführende Literatur

Weiterführende Literatur

Wenn ich clearden 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).

Bildbeschreibung hier eingeben

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

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

Bildbeschreibung hier eingeben

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

UPD

Eigentlich habe ich nur clearden 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;clearwurden 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.

  1. Der clearBefehl betrachtet terminfo/termcap und gibt entsprechende Steuersequenzen aus.
    1. Wenn der terminfo/termcap-Eintrag eine E3Fä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 den clearBefehl.
    2. Anschließend nutzt es die clearFunktion zum Löschen des sichtbaren Bildschirms.
  2. 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:
  3. 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 CSI Jlö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.

Insbesondere wenn es um das GNOME-Terminal geht:

  1. Der Terminaltyp ist korrekt gnome, manche Leute lassen ihn jedoch fälschlicherweise auf eingestellt xterm.
  2. Der gnomeTerminfo-Eintragdefiniert keine E3Fähigkeit, und auf vielen Systemen — immer noch! — tut dies auch der xtermEintrag nicht, da dies nicht durchgesickert ist vonDickey-Terminologie. clearSchreibt also einfach den Inhalt der clearFähigkeit aus.
  3. Der Inhalt der clearFunktion für diese Terminfo-Einträge sind die Steuersequenzen zum Positionieren des Cursors und anschließenden Löschen des gesamten Bildschirms.
  4. 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 clearBefehl 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

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 tputsollte 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 resetder POSIX-Definition sollte es auch in jedem POSIX-kompatiblen System funktionieren:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html

verwandte Informationen