Welche Arten von Sequenzen sind Escape-Sequenzen, die mit "\ 033]" beginnen?

18

Ich habe in Bash viele Escape-Sequenzen gefunden, die mit beginnen \033], aber was sind diese Sequenzen und warum beginnen sie mit \033]?

Sessho
quelle

Antworten:

25

Die Saite ist eigentlich \033[und das ist nicht die ganze Sache.

Nach dieser öffnenden Klammer folgt eine Reihe von Zahlen und Symbolen. Diese Zeichenfolge wird als Escape-Sequenz bezeichnet und dient unter anderem zur Steuerung des Cursors und der Textfarbe der Konsole.

Nicht druckbare Escape-Sequenzen müssen eingeschlossen werden \[\033[ and \]

Wenn die Escape-Sequenz die Textfarbe steuert, folgt ein m.

Hier ist eine Tabelle für die Farbsequenzen:

Black       0;30     Dark Gray     1;30  
Blue        0;34     Light Blue    1;34  
Green       0;32     Light Green   1;32  
Cyan        0;36     Light Cyan    1;36  
Red         0;31     Light Red     1;31  
Purple      0;35     Light Purple  1;35  
Brown       0;33     Yellow        1;33  
Light Gray  0;37     White         1;37   

Wenn Sie also möchten, dass die Eingabeaufforderung Ihrer Konsole blau ist, verwenden Sie die folgende Escape-Sequenz (im Dateinamen, den ich vergesse):

\[\033[34m\]

(Beachten Sie die m)

Diese Escape-Sequenz steuert jedoch nicht nur die Farbe. Es kann auch die Cursorbewegung steuern. Hier ist eine Tabelle / Liste mit den Bewegungscodes und wie sie funktionieren:

  • Positionieren Sie den Cursor:

    \033[<L>;<C>H

    Oder

    \033[<L>;<C>f

    setzt den Cursor auf Zeile L und Spalte C.

  • Bewegen Sie den Cursor in N Zeilen nach oben:

    \033[<N>A
  • Bewegen Sie den Cursor N Zeilen nach unten:

    \033[<N>B
  • Bewegen Sie den Cursor in N Spalten vorwärts:

    \033[<N>C
  • Bewegen Sie den Cursor in N Spalten nach hinten:

    \033[<N>D
  • Lösche den Bildschirm und gehe zu (0,0):

    \033[2J
  • Löschen bis zum Zeilenende:

    \033[K
  • Cursorposition speichern:

    \033[s
  • Cursorposition wiederherstellen:

    \033[u

Beachten Sie jedoch, dass die letzten beiden in dem von Ihnen verwendeten Terminalemulator möglicherweise nicht funktionieren. Anscheinend nur xtermund nxtermbenutze diese beiden Sequenzen.

Ein Beispiel für eine dieser Escape-Sequenzen: Angenommen, ich möchte meinen Cursor in Zeile 3, Spalte (Zeichen) 9 positionieren. Dafür würde ich verwenden

\[033\[3;9H]

(Ich gehe davon aus, dass Spalte 0 die erste Position ist, das wäre also das 8. Zeichen).

Quelle: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (lesen Sie auch 6.2)

Allgemeine Lektüre: http://ascii-table.com/ansi-escape-sequences.php

Wikipedia: https://en.wikipedia.org/wiki/ANSI_escape_code

Der Wanderer
quelle
2
Ziehen Sie auch die Verknüpfung zu en.wikipedia.org/wiki/ANSI_escape_code
cat in
2
Beachten Sie, dass '\ 033' das ESCAPE-Zeichen in Oktal ist, sodass es in Dezimal (27) oder Hexadezimal (0x1B) angegeben werden kann. Es gibt andere übliche Möglichkeiten, ESCAPE zu schreiben, z. B. '^ [' in Shell-Skripten, "\ e" in bindkey usw.
jamesqf
1
Bitte beachten Sie, dass einige Einträge in dieser Tabelle irreführend oder ungenau sind: Fett, Ohnmacht, Unterstreichung usw. können unabhängig von der Farbe eingestellt und zurückgesetzt werden und werden zusammen mit den Farben auch um 0 zurückgesetzt. Es gibt eine ganze Reihe von Codes (40–49) für den Hintergrund, und 7 vertauscht stattdessen den Vordergrund und den Hintergrund. ESC [2Klöscht die gesamte Zeile vor und nach dem Cursor. Eine viel bessere Quelle wäre der Wikipedia-Artikel oder Sie könnten direkt zu ECMA-48 , Abschnitt 8.3.117 SGR - Select Graphic Rendition gehen .
DeltaB
Der Ausdruck "'m' Zeichen am Ende jedes der folgenden Sätze wird als Stoppzeichen verwendet" in cplusplus.com ist ebenfalls etwas verwirrend, da die folgende Tabelle Befehle enthält, die offensichtlich nicht mit einem abgeschlossen sind "m". Tatsächlich scheint es hier noch irreführender, wenn es ganz oben dargestellt wird.
Ilkkachu
1
Technisch ist das Führen 0;in den Farbsequenzen unnötig. Das macht nur die Hintergrundfarbe zum Standard, bevor der Vordergrund eingestellt wird. Sie können den Hintergrund auch mit einstellen 4x.
Fund Monica's Lawsuit
17

Sie sind Steuerbefehle für das Terminal.

Terminals waren ursprünglich eher dumme Geräte, die an eine serielle Schnittstelle angeschlossen waren, und nicht die schicke GUI-Software mit mehreren Registerkarten und Menüs, die wir jetzt haben. Da sie nur einen Strom von Zeichen (Bytes) erhielten, gab es keine klare Trennung zwischen Daten (was auf dem Bildschirm gedruckt werden soll) und Befehlen (wie es gedruckt werden soll). Stattdessen werden die Befehle mit speziellen Steuerzeichen dargestellt.

Die offensichtlichen Steuerzeichen sind Zeilenvorschub (Zeilenvorschub), Rücktaste und Glockenton, aber spezifischere Befehle werden als Folgen von Zeichen angegeben, die mit dem ESCZeichen beginnen (Code 27 in Dezimal, 0x1b in Hex oder 033 in Oktal). Es wird oft als ^[oder \033wie in Ihrem Beispiel dargestellt.

Die Sequenz ESC [wird als CSI oder Control Sequence Introducer bezeichnet und startet einen Befehl mit optionalen numerischen Parametern, der in der Regel mit einem Buchstaben endet, der den Hauptbefehl definiert. Die meisten gebräuchlichen Escape-Sequenzen fallen in diese Klasse.

Listen der Escape-Codes finden Sie z. B. in der console_codes(4)Manpage und auf der Wikipedia-Seite für ANSI-Escape-Codes .

Einige Beispiele:

ESC [ 4 A             move cursor 4 lines up (4 can be any number)
ESC [ 5 B             move cursor 5 lines down
ESC [ 2 K             erase current line 
ESC [ 30;46 m         set black text (30) on cyan background (46)
ESC [ 0 m             reset color and attributes

Sie können die Befehle zB mit Bash testen. Mit dem -eFlag echoakzeptiert der eingebaute Befehl \033eine Darstellung des ESCZeichens.

ZB druckt dies eine Begrüßung in Farbe in der Mitte des Bildschirms und eine andere normalerweise an der ursprünglichen Cursorposition:

echo -e '\033[s\033[12;30f\033[30;46m  Hello!  \033[0m\033[uhello'

Die Sequenz, ESC ]die Sie erwähnt haben, ist der OSC- oder Betriebssystembefehl, der hauptsächlich im Befehl zum Festlegen des Fenstertitels verwendet wird, xtermund andere, z.

echo -e '\033]0;new window title\a'

Außerdem gibt es ESC ( A(und andere Buchstaben), die nationale Zeichensätze auf einigen Terminals auf eine möglicherweise komische Weise festlegen .

ilkkachu
quelle
8

Mit einem Escape-Zeichen und einer eckigen Klammer rechts escape]wird ein Betriebssystembefehl ( OSC) eingeleitet.

Es befindet sich in ECMA-48 und Sie können eine Zusammenfassung der von xterm in XTerm- Steuersequenzen verwendeten Steuersequenzen lesen , z. B. um den Titel des Terminalfensters zu ändern.

Escape-Sequenzen können mit verschiedenen Zeichen beginnen. Die C1 (8-Bit) Steuerzeichen Abschnitt in XTerm- Steuersequenzen einige von denen erwähnt: CSI(die Sie als sehen escape[, APC, DCS, PM. Der Grund für das unterschiedliche (zweite) Zeichen ist , weil das Paar (Flucht- und ]) mit einem verbunden ist Ein-Byte-Steuerzeichen, das für verschiedene Arten von Escape-Sequenzen verwendet wird.

Wenn Sie die Spezifikation durchlesen, werden Sie feststellen, dass CSIfür Steuerelemente mit numerischen Parametern verwendet wird, während OSCZeichenfolgen zulässig sind. Abgesehen von der Syntax hat das Komitee, das diesen Standard erstellt hat, Anwendungen für APCund in Betracht gezogen, PMdie sich von DCSund unterschieden OSC.

Thomas Dickey
quelle
7

Diese werden als ANSI-Escape-Codes bezeichnet und auf der Manpage für console_codes aufgelistet . Sie sind nicht Bash-spezifisch, sondern funktionieren in jeder Konsolenanwendung, solange das Terminal sie unterstützt (die meisten Terminalemulatoren unterstützen sie).

Joey Marianer
quelle
1

Die in den anderen Antworten beschriebenen "Escape-Sequenzen" hängen davon ab, welchen Terminaltyp Sie haben (meistens "ANSI" oder Derivate / ähnliche).

$ echo $TERM  
xterm

Wenn Sie Skripte schreiben möchten, die (etwas) UNABHÄNGIG vom Terminal sind, aber dennoch zB Farbe und andere Besonderheiten verwenden, dann schauen Sie sich den Inhalt von an man terminfo.

z.B

$ echo -n ".";tput setb 6;tput setf 4;echo -n "test";tput sgr0;echo "."

wird .test.mit testgelblichem Hintergrund und roter Vordergrundfarbe gedruckt , und dies funktioniert für JEDES Terminal, das tatsächlich in der Lage ist, Farben auf die gleiche Weise zu verwenden.

Um zu sehen, was tatsächlich gedruckt wird, leiten Sie es od -t x1zwie in

$ tput sgr0 | od -t x1z  
0000000 1b 28 42 1b 5b 6d                                >.(B.[m<  
0000006

... wobei die Werte hexadezimal angezeigt werden (aufgrund von "x").

Hannu
quelle