Was genau ist Scrollback und Scrollback Buffer?

23

Was sind "scrollback" und "scrollback buffer" in Programmen wie bashund screenund in welcher Beziehung stehen sie zu tty, den ausgeführten Programmen und stdin / stdout / stderr?

Hier ist die einzige Definition von "scrollback", die ich bisher gefunden habe (im Archlinux-Wiki ):

Scrollback ist eine Funktion, die in einer Textkonsole implementiert ist, damit der Benutzer zurückgehen kann, um die Textzeilen anzuzeigen, die vom Bildschirm gescrollt wurden. Dies wird durch einen Puffer ermöglicht, der nur zu diesem Zweck zwischen dem Videoadapter und dem Anzeigegerät erstellt wird. der Scrollback-Puffer.

Dies wirft jedoch weitere Fragen für mich auf:

  • Bedeutet es "Funktion" wie in "Unterprogramm" oder wie in "Feature"?
  • Gibt es einen Unix-Standard oder eine API für diesen Scrollback-Puffer?
  • Welche dieser Programme steuern in einem "Stapel" von Programmen, z. B. vimgestartet in screengestartet in bashgestartet sshin einem Terminalemulator, den Scrollback-Puffer?

Ich habe auch screenauf die Rückholung in eine Datei Dump . Diese Datei hatte oben viel Leerraum und es sieht so aus, als ob die "Ansicht", die mein Terminal-Emulator mir zeigt, einfach die untersten Zeilen des Puffers ist.

  • Kann ein Programm wie dieses deshalb vimmein gesamtes Terminalfenster "löschen", weil es vorübergehend Zugriff auf den Scrollback-Puffer der übergeordneten Shell erhält?
  • Oder vimverwendet es einen eigenen Scrollback-Puffer, der irgendwie über dem übergeordneten Scrollback-Puffer liegt?
Oleg
quelle

Antworten:

28

Dies ist eine etwas komplizierte Frage. Ich werde versuchen, Ihre Fragen zu beantworten, aber zuerst eine allgemeine Beschreibung:

Der Scrollback-Puffer wird von Ihrem Terminal-Emulator ( xterm, Konsole, GNOME Terminal) implementiert . Es enthält den gesamten Text, der auf dem Bildschirm angezeigt wurde, einschließlich der Standardausgabe und des Standardfehlers von jedem Programm, das Sie im Terminal ausführen. Es ist eine reine Terminal-Funktionalität, mit der Sie einen Blick auf vergangene Ausgaben werfen können, die möglicherweise an Ihnen vorbeigekommen sind, oder prüfen können, was zuvor gesagt wurde.

Sie können sich den Scrollback-Puffer als eine lange Seite der protokollierten Ausgabe und Ihr Terminal-Fenster als ein Fenster vorstellen, das jeweils nur einen Teil davon betrachtet. Wenn Sie noch keinen Bildlauf durchgeführt haben, sehen Sie das hintere Ende des Puffers. Normalerweise wird im Terminal eine Begrenzung für die Anzahl der Zeilen konfiguriert, die es verfolgt, bevor es zu vergessen beginnt.

Angenommen, die Grenze liegt bei 1000 Zeilen. Für die ersten tausend Zeilen der Ausgabe in Ihrer Sitzung hängen Sie einfach den Puffer an, und Sie können bis zum Beginn Ihrer Sitzung nach oben scrollen. Sobald die 1001. Ausgabezeile erreicht ist, wird die erste Zeile im Puffer gelöscht, und der am weitesten zurückliegende Bereich, den Sie scrollen können, ist die zweite Zeile Ihrer Sitzung. Der Puffer enthält immer die letzten tausend Ausgabezeilen, die auf Ihrem Bildschirm angezeigt wurden, und Sie können jederzeit nach oben scrollen, um frühere Ausgaben anzuzeigen.

  • Bedeutet es "Funktion" wie in "Unterprogramm" oder wie in "Feature"?

    Dies ist "Funktion" wie in "Feature". Der Terminalemulator verfügt über eine Funktion, die aufzeichnet, was auf dem Bildschirm angezeigt wird, und in der Sie einen Bildlauf nach oben und unten durchführen können. Die Konsolen einiger Systeme unterstützen auch einen eingeschränkten Scrollback.

    Es wird ein bisschen komplizierter, wenn Sie screenin die Mischung werfen . Zu diesem Zeitpunkt screenwird der Scrollback-Puffer selbst emuliert. Aus diesem Grund können Sie ihn innerhalb des Programms kopieren und einfügen, anstatt nur mit (z. B.) X-Auswahl.

  • Gibt es einen Unix-Standard oder eine API für diesen Scrollback-Puffer?

    Die kurze Antwort lautet Nein, sie wird nur von Ihrem Terminal bereitgestellt. Je länger die Antwort, desto weiter unten.

  • Welche dieser Programme steuern den Scrollback-Puffer in einem "Stapel" von Programmen, z. B. "vim", das auf dem Bildschirm gestartet wurde, in "bash", das in "ssh" gestartet wurde, in einem Terminal-Emulator?

    Im Falle von vimund bashkontrollieren sie das überhaupt nicht (Achtung, weiter unten). Ihr Terminal stellt den Scrollback-Puffer für alle darin enthaltenen Programme bereit, beginnend mit Ihrer Shell. screensimuliert, wie oben erwähnt, den Scrollback selbst.

  • Ich habe den Scrollback auch mit screen in eine Datei geschrieben. Diese Datei hatte oben viel Leerraum und es sieht so aus, als wäre die "Ansicht", die mein Terminal-Emulator anzeigt, einfach die untersten Zeilen des Puffers.

    Dies ist screender interne Puffer. Was zu diesem Zeitpunkt auf Ihrem Bildschirm angezeigt wird, befindet sich im Allgemeinen ganz unten im Puffer.

  • Kann ein Programm wie vim deshalb mein gesamtes Terminalfenster "löschen", weil es vorübergehend Zugriff auf den Scrollback-Puffer der übergeordneten Shell erhält?

    Hier ist ein Teil, wo es viel komplexer wird. Praktisch alle X-basierten Terminalemulatoren simulieren einen VT100, und dort unterstützen sie einen "Alternate Screen Buffer" . Im Gegensatz zum normalen Puffer, der für die meisten Terminalinteraktionen mit sequenzieller Ausgabe verwendet wird, entspricht der alternative Bildschirmpuffer genau der Größe Ihres Terminals. Es gibt kein Scrollen nach oben oder unten, da es nicht größer ist als das, was angezeigt wird.

    Die Idee dabei ist, einer Vollbildanwendung zu ermöglichen, das zu tun, was sie tun muss, ohne durch etwas gestört zu werden, das Sie bereits auf dem Bildschirm hatten, und Sie dann zu genau der Anzeige zurückkehren zu lassen, die Sie zuvor hatten. Das ist der Grund, warum, wenn Sie es eingeben vim, der gesamte Bildschirm ausgefüllt wird. Wenn Sie es jedoch verlassen, wird die Terminalausgabe, die Sie zuvor hatten - alle Ihre vorherigen Eingabeaufforderungen und Befehlsausgaben - wieder angezeigt. vimWechselt beim Start in den alternativen Bildschirmpuffer und beim Verlassen wieder in den normalen Puffer.

    Dieser alternative Puffer ist einer der oben erwähnten Vorbehalte. Manchmal kann das Programm dem Terminal wirklich mitteilen, was mit dem Puffer geschehen soll.

    screenist ein anderes Programm, das dies tut, weshalb die Bildlauffunktion Ihres Terminals in der Regel nicht funktioniert, während Sie sich in einer Bildschirmsitzung befinden. Sie  screenemulieren den Bildlaufpuffer selbst, sodass Sie die internen Funktionen verwenden müssen, um zur alten Ausgabe zurückzukehren.

  • Oder verwendet vim einen eigenen Scrollback-Puffer, der irgendwie über dem übergeordneten Scrollback-Puffer liegt?

    Ich habe dies in der vorherigen Frage meistens beantwortet, aber die kurze Antwort auf diese spezielle Frage lautet, dass vimvom Terminal ein eigener temporärer Puffer ohne Scrollback abgerufen wird und dann das gesamte Scrollen Ihrer Dokumente intern durchgeführt wird.

Alle diese Ausnahmen, die ich erwähnt habe:

Es wird wieder etwas komplizierter. Ich sagte, dass Anwendungen keine Kontrolle über das Scrollback haben und dass es vollständig vom Terminal bereitgestellt wird. In einigen Fällen besteht bei einigen Terminals eine eingeschränkte Interaktion. Das Programm druckt bestimmte Escape-Sequenzen aus - wenn Sie in der Vergangenheit Terminalfarben manuell verwendet haben, haben Sie gesehen, wie sie aussehen - und das Terminal kann diese interpretieren und sein Verhalten ändern oder sogar Informationen an das Programm zurücksenden. Welche Escape-Sequenzen zur Verfügung stehen, ist in der Datenbank termcap (Terminal Capability) beschrieben .

Einige Terminals unterstützen eine eingeschränkte Abfrage und Manipulation des Scrollback-Puffers. Viele xtermDerivate verfügen über Escape-Sequenzen, die das Terminal anweisen, durch die Ansicht zu scrollen. Viele Terminals unterstützen auch das Festlegen eines bestimmten Bildschirmbereichs für den Bildlauf, der Rest bleibt erhalten. Das neigt dazu, den Scrollback-Puffer zu brechen.

Nahezu alle Terminals unterstützen Sequenzen zum Bewegen des Cursors auf dem Bildschirm. Auf diese Weise kann die ncursesBibliothek alle verschiedenen Teile der Anzeige aktualisieren. Sie können sich die VT100-Sequenzenxterm ansehen, die von unterstützt werden . Die Art und Weise, wie diese mit dem Scrollback-Puffer interagieren, kann manchmal etwas seltsam sein, insbesondere im Fall von Dingen, die ihr eigenes Scrollverhalten implementieren, wie z less. B. dem Befehl. Es kann vorkommen, dass in Ihrem Scrollback doppelte oder fehlende Zeilen vorhanden sind, da der lessText in einer Weise überstrichen wird, die Ihr Terminal nicht erwartet hat. Andere Programme füllen manchmal Ihren Puffer mit mehreren Kopien ihrer gesamten Anzeige.

Michael Homer
quelle
1
Vielen Dank für diese tolle Antwort! Es ist sehr vollständig und trotz des komplexen Themas leicht verständlich. Das zusätzliche Detail bringt mich dazu, mehr zu lernen und zeigt mir, wo ich suchen muss.
Oleg
1
Einige Terminals verfügen über eine Option für unbegrenztes Zurückscrollen. Bedeutet dies, dass das gesamte Zurückscrollen RAM ist (also wird irgendwann ein Malloc-Fehler oder OOM auf dem Terminal angezeigt), oder versucht es, auf die Festplatte zu schreiben und von der Festplatte zu laden, wie Sie es möchten scrollen? Ein bisschen wie Chat-Programme.
CMCDragonkai
Escape-Sequenzen zum Abfragen befinden sich im Allgemeinen nicht in termcap (und auch nicht in terminfo, was vollständiger wäre).
Thomas Dickey
@CMCDragonkai Konsole behält einen endlichen Scrollback im Speicher, platziert jedoch einen unbegrenzten Scrollback unverschlüsselt auf der Festplatte. Sie werden im Einstellungsdialog darauf hingewiesen. VTE (Gnome-Terminal und andere) speichert den Scrollback (endlich oder unendlich) komprimiert und verschlüsselt auf der Festplatte. Ich weiß nicht, was andere Emulatoren tun.
Egmont