Was bedeutet eine Bash-Sequenz '\ 033 [999D' und wo wird sie erklärt?

19

Ich bin auf Bash-Sequenzen wie \033[999Dund gestoßen, \033[2K\rdie verwendet werden, um einen Ausdruck auf einem Terminal zu manipulieren. Aber was bedeuten diese Sequenzen? Wo finde ich eine Liste / Zusammenfassung im Web, um die Bedeutung dieser Sequenzen herauszufinden?

Alex
quelle
3
Dies sind terminale Sequenzen, keine Bash-Sequenzen. Sie müssen sich die Dokumentation Ihres Terminals ansehen, um deren Funktion zu bestimmen.
Chris Down
1
Diese Sequenzen dienen dazu, die Ausgabe einzufärben. Überprüfen Sie: stackoverflow.com/questions/16845699/… und stackoverflow.com/questions/5947742/…
adizere
1
@Adizere Nicht alle Escape-Sequenzen führen Farbänderungen durch. Die Sequenzen in diesem Q dienen der Linienmanipulation und der Cursorbewegung, nicht der Farbe.
Casey

Antworten:

32

Siehe diesen Link http://www.termsys.demon.co.uk/vtansi.htm . Wie Anthon sagt, \033 ist dies der C-artige Oktalcode für ein Escape-Zeichen. Das [999Dbewegt den Cursor 999 Spalten zurück, was vermutlich ein brachialer Weg ist, um an den Zeilenanfang zu gelangen. [2Klöscht die aktuelle Zeile. \rist ein Wagenrücklauf, der den Cursor zum Anfang der aktuellen Zeile zurückbewegt, und ist eher eine Escape-Sequenz im C-Stil als eine Terminal-Steuersequenz.

Aktualisieren

Wie bereits erwähnt, haben diese Steuersequenzen nichts mit sich bashselbst zu tun , sondern mit dem Endgerät / Emulator, auf dem der Text angezeigt wird. Es war einmal üblich, dass diese Sequenzen von einer völlig anderen Hardware interpretiert wurden. Ursprünglich würde jeder auf völlig unterschiedliche Codesätze reagieren. Zu diesem Zweck wurden die termcapund terminfo-Bibliotheken verwendet, um Code zu schreiben, der mit mehreren Terminals kompatibel ist. Der tputBefehl ist eine Schnittstelle zur terminfoBibliothek ( termcapUnterstützung kann auch kompiliert werden) und bietet eine robustere Möglichkeit, kompatible Sequenzen zu erstellen.

Allerdings gibt es auch den ANSI X3.64- oder ECMA-48- Standard. Jede moderne Terminal-Implementierung wird dies nutzen. terminfoSie termcapsind weiterhin relevant, da die Implementierung möglicherweise unvollständig ist oder nicht standardmäßige Erweiterungen enthält. Für die meisten Zwecke kann jedoch davon ausgegangen werden, dass gängige ANSI-Sequenzen funktionieren.

In den xterm FAQ finden Sie einige interessante Informationen zu den Unterschieden zwischen modernen Terminalemulatoren (viele versuchen nur, sich xtermselbst zu emulieren ) und zum xtermZusammenhang der Sequenzen mit den im obigen Link genannten VT100-Terminals. Es enthält auch eine endgültige Liste der xtermSteuersequenzen .

Ebenfalls gebräuchlich ist natürlich die Linux-Konsole, in der eine definitive Liste der Steuersequenzen man console_codeszusammen mit einem Vergleich zu zu finden ist xterm.

Graeme
quelle
Der von Ihnen angegebene Link ist genau die Seite, nach der ich gesucht habe.
Alex
@Alex Ich bin froh, dass ich es selbst gefunden habe, die meisten Seiten, die ich gesehen habe, haben nur Deckblattfarben und sind irgendwie sehr komplex zu lesen. Das macht es schön und einfach.
Graeme
Achten Sie darauf, dass die Aktion von Escape-Codes vom Terminaltyp abhängt (und Sie können auf modernen Bildschirmen / Betriebssystemen mehrere Terminaltypen emulieren). Sie können tputstattdessen Befehle verwenden, um eine größere Portabilität zu erzielen (allerdings auf Kosten einer geringeren Abdeckung der Besonderheiten Ihres Terminals). VT100 (von dem auf dieser Seite die Rede ist) wird von vielen unterstützt (aber ich glaube, es wird nicht alles unterstützt ...). Ihre TERM-Variable kann jedoch auf ein anderes Terminal eingestellt sein, was sich auf die Auswirkungen einiger Befehle auswirken kann
Olivier Dulac,
@Olivier, richtig tputist ein robusterer Weg. Aber es ist eher die ANSI-Kompatibilität als das spezifische VT100-Terminal, das jetzt ziemlich allgegenwärtig ist, obwohl ich mir vorstelle, dass es möglich ist, xtermin einen Modus zu wechseln, der sie nicht akzeptiert. Ich werde mit ein paar mehr Infos dazu updaten, denke ich.
Graeme
@Olivier Viele Terminal-Emulatoren sind ebenfalls so eingestellt TERM=xterm, aber implementieren nicht alles, was dies xtermtut.
Graeme
5

Dies \033ist das Escape-Zeichen, und diese Sequenzen sind nicht bash-spezifisch, sondern werden vom Terminal (Software oder Hardware (über Netzwerk oder serielle Leitung)) interpretiert, in dem das (bash-) Programm ausgeführt wird. Es gibt viele solcher Sequenzen .

Was jeder tut, hängt von dem Terminal ab, von dem er abhängig ist, und kann auch von einer vorherigen Sequenz abhängen, die den Status des Terminals ändert.

Diese werden oft verwendet, um Farben in der Bash-Eingabeaufforderung festzulegen , aber ich habe Ihre speziellen Beispiele auf dieser Seite nicht gefunden.

Anthon
quelle
3

'\ 033 [999D' ist lustig. Einige Terminals implementieren weniger Escape-Sequenzen, sodass dies möglicherweise erforderlich ist, wenn sich keine von '\ 033 [1G', '\ 033 [1; 1H', '\ 033 [1; 1f' oder '\ r' so verhält wie sie sollte, aber wer verwendet eine tausendspaltige Textanzeige? Diese Sequenzen haben unter Linux eine Manpage: console_codes (4) . bjh21 hat eine detaillierte Liste aller Codes . Je nachdem, welches Programm '\ 033' analysiert, ist möglicherweise die deutlichere Ersetzung '\ e' verfügbar.

Es ist nicht beabsichtigt, dass diese direkt verwendet werden - die richtige Art, Terminal-Steuerbefehle auszugeben, ist mit einer Abstraktionsschicht wie ncurses -, aber sie funktionieren genauso gut mit String-Literalen.

user130144
quelle
Guter Punkt, ich bin einfach davon ausgegangen, dass \033[999Ddies über die vorherigen Zeilen hinausgeht. Kann aber nur das Ergebnis einer zweifelhaften Codierung sein;) Sie können bashdie Escape-Codes auch direkt interpretieren, z. B.$'\033[999D'
Graeme