Risposte:
La stringa è in realtà \033[
e non è tutto.
Dopo quella parentesi di apertura arriva una serie di numeri e simboli. Questa stringa è nota come sequenza di escape e viene utilizzata, tra le altre cose, per controllare il cursore e il colore del testo della console.
le sequenze di escape non stampabili devono essere racchiuse in
\[\033[ and \]
Se la sequenza di escape controlla il colore del testo, sarà seguita da un m
.
Ecco una tabella per le sequenze di colori:
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
Quindi, se vuoi che il tuo prompt della console sia blu, useresti la seguente sequenza di escape (nel nome del file che sto dimenticando):
\[\033[34m\]
(Nota il m
)
Questa sequenza di escape non controlla solo il colore, tuttavia. Può anche controllare il movimento del cursore. Ecco una tabella / elenco con i codici di movimento e come funzionano:
Posiziona il cursore:
\033[<L>;<C>H
O
\033[<L>;<C>f
posiziona il cursore sulla riga L e colonna C.
Sposta il cursore su N righe:
\033[<N>A
Sposta il cursore in basso su N righe:
\033[<N>B
Sposta il cursore in avanti su N colonne:
\033[<N>C
Sposta il cursore indietro di N colonne:
\033[<N>D
Cancella lo schermo, passa a (0,0):
\033[2J
Cancella fino alla fine della riga:
\033[K
Salva posizione cursore:
\033[s
Ripristina posizione cursore:
\033[u
Basta essere consapevoli del fatto che gli ultimi due potrebbero non funzionare nell'emulatore di terminale che si utilizza. Apparentemente, solo xterm
e nxterm
usa quelle due sequenze.
Ed esempio usando una di queste sequenze di escape: diciamo che voglio posizionare il cursore sulla riga 3, colonna (carattere) 9. Per questo, vorrei usare
\[033\[3;9H]
(Suppongo che la colonna 0 sia la prima posizione, quindi sarebbe l'ottavo carattere).
Fonte: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (leggi anche 6.2)
Lettura più generale: http://ascii-table.com/ansi-escape-sequences.php
[2K
cancella l'intera riga sia prima che dopo il cursore. Una fonte molto migliore sarebbe l'articolo di Wikipedia, oppure potresti andare direttamente a ECMA-48 , sezione 8.3.117 SGR - Seleziona rappresentazione grafica .
0;
nelle sequenze di colori non è necessario. Questo rende il colore di sfondo predefinito prima di impostare il primo piano. Puoi anche impostare lo sfondo con 4x
.
Sono comandi di controllo per il terminale.
I terminali erano in origine dispositivi piuttosto stupidi collegati a una porta seriale e non quei fantasiosi software con interfaccia grafica multi-scheda con menu che ora abbiamo. Dato che hanno ricevuto solo un flusso di caratteri (byte), non vi era alcuna chiara separazione tra i dati (cosa stampare sullo schermo) e i comandi (come stamparli). Invece i comandi sono rappresentati con caratteri di controllo speciali.
I caratteri di controllo ovvi sono elementi come avanzamento riga (nuova riga), backspace e segnale acustico campana, ma comandi più specifici sono dati come sequenze di caratteri, a partire dal ESC
carattere (codice 27 in decimale, 0x1b in esadecimale o 033 ottale). Viene spesso rappresentato come ^[
o \033
come nel tuo esempio.
La sequenza ESC [
è denominata CSI o introduzione della sequenza di controllo e avvia un comando con parametri numerici opzionali, terminando in genere con una lettera che definisce il comando principale. La maggior parte delle sequenze di escape comuni rientrano in questa classe.
Gli elenchi dei codici di escape sono disponibili ad esempio nella console_codes(4)
pagina man e nella pagina Wikipedia per i codici di escape ANSI .
Qualche esempio:
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
È possibile testare i comandi con ad esempio Bash. Usando la -e
bandiera, il echo
comando incorporato accetta \033
come rappresentazione del ESC
personaggio.
Ad esempio, questo stampa un saluto a colori al centro dello schermo e un altro normalmente nella posizione originale del cursore:
echo -e '\033[s\033[12;30f\033[30;46m Hello! \033[0m\033[uhello'
La sequenza ESC ]
che hai citato è l'OSC o il comando del sistema operativo, che viene utilizzato principalmente nel comando per impostare il titolo della finestra xterm
e altri, ad esempio:
echo -e '\033]0;new window title\a'
Poi ci sono anche ESC ( A
(e altre lettere) che impostano set di caratteri nazionali su alcuni terminali, con un effetto potenzialmente esilarante .
Escape seguito da una parentesi quadra destra escape]
viene utilizzato per introdurre un comando del sistema operativo ( OSC
).
È in ECMA-48 e puoi leggere un riepilogo delle sequenze di controllo utilizzate da xterm nelle sequenze di controllo XTerm , ad esempio per modificare il titolo della finestra del terminale.
Le sequenze di escape possono iniziare con caratteri diversi. La C1 (8-bit) caratteri di controllo sezione XTerm controllo sequenze menziona alcuni di quelli: CSI
(che si vede come escape[
, APC
, DCS
, PM
. La ragione per la diversa natura (secondo) è perché la coppia (fuga e ]
) è associato ad un carattere di controllo a byte singolo utilizzato per diversi tipi di sequenza di escape.
Se leggi le specifiche, noterai che CSI
viene utilizzato per i controlli con parametri numerici, mentre OSC
consente le stringhe. Al di là della sola sintassi, il comitato che ha creato questo standard aveva in mente gli usi APC
e PM
che differiva da DCS
e OSC
.
Questi sono chiamati codici di escape ANSI e sono elencati nella pagina man per console_codes . Non sono specifici di Bash, ma funzionano piuttosto in qualsiasi applicazione console fintanto che il terminale li supporta (la maggior parte degli emulatori di terminali lo fanno).
Le "sequenze di escape" descritte nelle altre risposte dipendono dal tipo di terminale in uso (il più delle volte "ANSI" o derivati / simili).
$ echo $TERM
xterm
Se desideri scrivere script che sono (in qualche modo) INDIPENDENTI dal termine, ma che usano ancora ad esempio il colore e altre caratteristiche speciali, dai un'occhiata al contenuto di man terminfo
.
per esempio
$ echo -n ".";tput setb 6;tput setf 4;echo -n "test";tput sgr0;echo "."
stamperà .test.
con lo test
sfondo giallastro e il colore di primo piano rosso, e questo funzionerà per QUALSIASI terminale che sia effettivamente in grado di usare i colori nello stesso modo.
Per vedere cosa viene effettivamente stampato, inserirlo od -t x1z
come in
$ tput sgr0 | od -t x1z
0000000 1b 28 42 1b 5b 6d >.(B.[m<
0000006
... dove i valori sono mostrati in esadecimali (a causa di "x").