Das seltsame Verhalten des Bash-Clear-Befehls löscht den Scrollback-Puffer.

Das seltsame Verhalten des Bash-Clear-Befehls löscht den Scrollback-Puffer.

Immer wenn ich in meinem Terminal „clear“ ausführe, wird der Scrollback-Puffer vom oberen Bildschirmrand bis zur aktuellen Zeile gelöscht. Ich habe es in xterm, st und urxvt versucht, aber das Problem besteht weiterhin. Gibt es eine Möglichkeit, das Verhalten von „clear“ so zu ändern, dass der Scrollback-Puffer nicht berührt wird?

Antwort1

Der Kommentar "vom oberen Bildschirmrand bis zur aktuellen Zeile" ist mehrdeutig. Wenn Sie vom oberen Bildschirmrand bis zur aktuellen Zeile meinten,sichtbarer Teildes Bildschirms, das ist nicht diezurückblättern. Das Scrollback eines Terminals ist der Teil, den Sie nur mit der Bildlaufleiste (oder geeigneten Tasten wie Umschalt+Bild-auf) sehen können.

XTerm-Steuersequenzendokumentiert die relevante Escape-Sequenz:

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).

Die Terminalbeschreibungsfunktion clearverwendet die vorletzte, z. B.

clear=\E[H\E[2J

, um den Cursor nach oben links zu positionieren und dann den gesamten (sichtbaren) Bildschirm zu löschen.könnteverwenden Sie dieUnten löschen, wird aber in der Terminalbeschreibung nicht verwendet.

Bezogen auf das Löschen derzurückblättern: Dies ist eine terminalspezifische Funktion, ursprünglich eine Escape-Sequenz in xterm (1999, dokumentiert inctlseqs.msaber nicht in Änderungen erwähnt) und später (2011) als Erweiterung für die Linux-Konsole und die entsprechende Terminalbeschreibung implementiert. Die Terminaldatenbank listet es als"sonstige Erweiterungen".

Derzeit verfügen diese Terminalbeschreibungen über die Funktion:

Ob es in xterm-Look-alikes wie VTE unterstützt wird, müsste durch Tests beantwortet werden (es gibt keine nützliche Dokumentation für VTE oder Konsole).

Wenn Sie die Erweiterung nicht verwenden möchten, können Sie dieE3Fähigkeit aus der Terminalbeschreibung, die Sie verwenden, z. B.

infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo

Ich habe vorgeschlagen, die Optionen zu verwenden-1Und-xum die Formatierung zu vereinfachen und die zu ändernde Funktion anzuzeigen. Das Beispiel inhttps://ghostbin.com/paste/kfsbjsteht im Einklang mit diesem Rat:

  • der Pfadname /home/flowerpick/.terminfo/x/xtermwürde von ncurses verwendet werden
  • Bei den Fähigkeiten AXund XThandelt es sich um erweiterte Fähigkeiten (wie E3), die mit der -xOption angezeigt werden.

Wenn Sie mehr als einen Terminaltyp verwenden, müssen Sie dies für jeden tun (Wert von $TERM), und die Änderung gilt nur für die Maschine, auf der Sie ausführen clear. Die ersten Zeilen der infocmpAusgabe zeigen, an welchem ​​Sie arbeiten:

#   Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),

Beispielsweise wird auf etwas wie uxrvtgesetzt , wodurch in Zeilen wie diese erzeugt werden :$TERMrxvt-unicodeinfocmp

#       Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode       
rxvt-unicode|rxvt-unicode terminal (X Window System),

Das stProgramm verwendet xterm(oder möglicherweise xterm-256color), obwohl es schon eine Weile her ist, seit ich eine Kopie von gesehen habeDasdas hat gut genug funktioniert, um einen Kommentar abzugeben.

Übrigens, dukönntehabe einen Alias, für clearden die angegebene Escape-Sequenz gesendet wird (unter Ignorierung der Terminalbeschreibung), aber ich habe nicht gesehen, dass dies von irgendjemandem gemeldet wurde.

Wenn Sie "oben löschen" möchten, ist das nicht so einfach wie "clear" einzugeben. Die Escape-Taste \033[1Jlöscht von oben links bis zur aktuellen Cursorposition. Sie könnten ein Skript erstellen, das dies tut, um nur dieLinienüber Ihrem aktuellen Cursor:

  • Verwenden Sie den Cursorpositionsbericht, um die Zeile/Spalte zu finden, in der sich der Cursor gerade befindet, und
  • Wenn der Cursor nicht in der ersten Zeile steht (Speichern dieser Position), bewegen Sie den Cursor eine Zeile nach oben und dann (mit der hpaSequenz) bewegen SieRechtseine große Anzahl,
  • geben Sie das "Freizeichen oben" aus und
  • cupKehren Sie mit (Cursoradressierung) zur Ausgangsposition zurück .

Der Teil mit dem Cursorpositionsbericht scheint nicht in (zum Beispiel) einer Readline-Bindung zu funktionieren, daher habe ich ein Skript vorgeschlagen. Sie könnten eine Bindung erstellen, die die Funktionen zum Speichern/Wiederherstellen des Cursors verwendet, wenn das Problem nicht darin bestünde, in der ersten Zeile zu sein.

Antwort2

Ich hatte das gleiche Problem und das Hinzufügen eines Alias ​​hat .bashrcgeholfen:

alias clear='printf "\E[H\E[2J"'

Erinnerung: Die Änderungen werden .bashrcwirksam, nachdem Sie ein neues Terminal öffnen!

Antwort3

Ich verwende es regelmäßig, cleardamit meine Eingabeaufforderung an den oberen Bildschirmrand verschoben wird und dabei versehentlich den Scrollback-Puffer lösche, oft mit wichtigen Inhalten wie nützlichen Fehlermeldungen aus vorherigen Vorgängen.

Beim Überprüfen der Manpage wird eindeutig Folgendes angegeben:

„clear“ löscht Ihren Bildschirm, sofern möglich, einschließlich des Scrollback-Puffers (sofern die erweiterte Funktion „E3“ definiert ist).

Dort gibt es auch eine Option:

-x Versuchen Sie nicht, den Scrollback-Puffer des Terminals mit der erweiterten Funktion „E3“ zu löschen.

Seitdem habe ich dies zu meiner Liste der Aliase in ~/.bashrc hinzugefügt:

alias clear='clear -x'

Beim Ausführen werde ich immer noch aufgefordert, nach oben zu gehen clear, aber jetzt kann ich bei Bedarf weiter nach oben zurückblättern.

Antwort4

Meine Lösung hierfür besteht darin, den folgenden Alias ​​zu meinem hinzuzufügen.bashrc

alias clear='tput reset'

Falls Sie das ursprüngliche Verhalten verwenden möchten, z. B. um vertrauliche Informationen aus dem Scrollback-Puffer zu löschen, können Sie die Version ohne Alias ​​ganz einfach aufrufen, indem Sie einen Backslash voranstellen, \wie in diesem Artikel erläutert.HieroderHierDas würde dann so aussehen

\clear

verwandte Informationen