Wie können Befehle wie „top update“ die Ausgabe ohne Anhängen in der Konsole aktualisieren?

Wie können Befehle wie „top update“ die Ausgabe ohne Anhängen in der Konsole aktualisieren?

Ich verbinde mich mit Remote-Linux-Servern über SSH über den Terminalemulator PuTTY. Ich stelle fest, dass die von mir ausgeführten Befehle und die Ausgabe auf der Konsole ständig im Terminalfenster angehängt werden. Wenn ich also die Bildlaufleiste verwende und nach oben/unten scrolle, kann ich die zuvor ausgeführten Befehle und ihre Ausgabe sehen, wie auf einem gedruckten Blatt Papier. Einige Befehle topaktualisieren die Ausgabe jedoch ständig, ohne als Anhänge auf der Konsole angezeigt zu werden. Wie funktioniert das?

Antwort1

Möglicherweise sind hier zwei Mechanismen am Werk.

Eine davon ist die Verwendung von ANSI-Escape-Codes (und in manchen Fällen auch anderer Nicht-ANSI-Codes), wie von Martin Prikryl in seiner Antwort erwähnt, um eine textbasierte pseudografische Schnittstelle zu implementieren. Das absolute Minimum hierfür sind genau zwei spezifische ANSI-Escape-Codes, ^[[2J, der alles auf dem Bildschirm löscht, und ^[[;H, der den Cursor nach oben links auf dem Bildschirm bewegt. Indem Sie diese kombinieren, können Sie den Inhalt jedes „Frames“ einzeln ausgeben, ohne den Scrollback-Puffer zu erweitern. Die meisten Anwendungen verwenden tatsächlich viel mehr als nur diese (zum Beispiel gibt es eine Reihe von Codes zum Bewegen des Cursors in beliebige Richtungen, und es ist ziemlich normal, diese zu verwenden, um Teile des Bildschirms zu überspringen, die „leer“ sein sollten). In der Praxis verwenden die meisten (aber bei weitem nicht alle) größeren Anwendungen entweder libcurses (oder häufiger ncurses) oder ein direktes Äquivalent, um all dies für sie zu erledigen.

Die andere Möglichkeit, die normalerweise mit der Verwendung von ANSI-Escape-Codes zur Manipulation des Bildschirminhalts kombiniert wird, ist eine spezielle Funktion, die ursprünglich von xterm bereitgestellt wurde, mittlerweile aber von den meisten guten Terminalemulatoren implementiert wird und als alternativer Bildschirmpuffer bezeichnet wird. Es gibt ein Paar Escape-Codes ( ^[[?1049hund ^[[1049l), mit denen zwischen diesem und dem normalen Scrollback-Puffer umgeschaltet werden kann. Durch das Umschalten auf den alternativen Bildschirmpuffer vor der Anzeige einer textbasierten Benutzeroberfläche können Programme die Änderung des Scrollback-Puffer vollständig vermeiden. Dadurch wird nicht nur verhindert, dass Sie scrollen, ohne die Tastenanschläge abfangen zu müssen, die normalerweise zum Scrollen führen würden, sondern das Programm kann auch Dinge tun, wie z. B. die Überprüfung des vorhandenen Terminalinhalts vor der Ausführung des Programms (und es wird einfacher zu sehen, was Sie getan haben, bevor Sie diese Vollbildanwendung geöffnet haben).

Antwort2

Was Sie beobachten, ist das Produkt einer historischen Entwicklung.

Die ersten interaktiven Terminals waren wahrhaftigFernschreiber; im Wesentlichen elektrische Schreibmaschinen, die an eine Telefonleitung angeschlossen sind. (Haben Sie sich schon einmal gefragt, warum /dev/ttyheißt so, wie es heißt?) Sie könnten einen Textbefehl eingeben (mit, wenn ich mich recht erinnere, sogar einer einfachen, umständlichen Zeilenbearbeitung) und würden eine Textausgabe erhalten.

Diese konnten sich natürlich nur von links nach rechts und von oben nach unten bewegen. Oh, Moment, das stimmt nicht! Sie konnten mit Strg-H ein Zeichen zurückgehen und es erneut eingeben, sodass es fett wurde. Siehe da, das ist es, waseinige Programme tun das immer nochdie Text für Drucker formatieren. Fernschreiber hatten auch einige grundlegende Steuercodes wie Zeilenvorschub, Seitenvorschub oder eine Glocke.

Der Schritt zu einem CRT-basierten Terminal war logisch, schon allein um die Bäume zu retten. Aber seitdem hat jedes Terminal (Emulator) die Grundfunktion eines Fernschreibers bereitgestellt: Sofern nicht anders angegeben (mit den berühmten Escape-Sequenzen), werden empfangene 7-Bit-ASCII-Codes, einschließlich der grundlegenden Steuercodes, als entsprechende Zeichen oder Befehle interpretiert und von links nach rechts und von oben nach unten angezeigt, beginnend an der aktuellen Cursorposition, die vom Terminal beibehalten wurde.

Da die intelligenteren Terminals jedoch tatsächlich in der Lage waren, Zeichen an beliebigen Zeilen-/Spaltenpositionen auf dem Bildschirm anzuzeigen, verfügten sie alle über eine Möglichkeit, dies programmgesteuert über Steuercodesequenzen zu tun, und die Betriebssysteme waren auf die eine oder andere Weise so konfiguriert, dass sie die richtigen Sequenzen verwendeten. Einige Programme, insbesondere Editoren, Shells und andere interaktive, benutzerorientierte Programme wie top, nutzen diese Fähigkeit, um den gesamten Bildschirm zu steuern.

Der Grund, warum dieser „visuelle Modus“ nicht weiter verbreitet ist, liegt darin, dass die einfache Ausgabe einer linearen Zeichenfolge ohne „Dekoration“ enorm vielseitig ist – und gleichzeitig für eine Vielzahl von Ausgaben ausreicht: Sie können tabellierte Daten drucken, die im Wesentlichen immer noch eine serielle Zeichenfolge mit Leerzeichen (Leerzeichen, Tabulator, Zeilenumbruch) sind. Das gesamte Unix/Linux-Ökosystem mit Pipes und Geräten basiert auf diesem Paradigma. Es ermöglicht Ihnen, „Bausteine“ wie „Find“, „Grep“, „Cut“ usw. zusammenzustecken und Textinformationen automatisch zu verarbeiten. Das wäre völlig unmöglich, wenn die Ausgabe mit Positionierungs- und Formatierungsbefehlen vermischt wäre.

Antwort3

Die meisten Befehle drucken einfach Zeilen auf das Terminal. Der Terminal-Client druckt diese Zeilen einfach so, wie es alte Zeilendrucker taten. Der Scrollback ist eine Darstellung desendloses Papieraus dem Drucker kommt.

Aber der Terminal-Client (auch bekannt alsTerminalemulatoren) kann noch viel mehr, darunter Dinge wie das Bewegen eines Cursors über den Bildschirm und damit das Drucken auf einem beliebigen Punkt des "Terminalbildschirms" durch den Server (die Remote-Anwendung). Das ist es, was Anwendungen wie top, vi, Midnight Commander usw. nutzen, um eine Vollbild-GUI-Schnittstelle zu implementieren (eigentlich einTUI-Schnittstelle). Diese erweiterten Funktionen werden implementiert mitANSI-Escape-Codes.

verwandte Informationen