2013-03-28 20 views
24

So che nei terminali bash un modo affidabile per cambiare colore sta usando sequenze di escape ANSI. Per esempio:BASE sequenza colore ANSI specifica per colore

echo -e "\033[0;31mbrown text\033[0;00m" 

dovrebbe uscita

brown text (in brown) 

C'è un modo per colore di uscita utilizzando un RGB specifico fissato con ANSI? Dire che voglio rosso vivo:

echo -e "**\033[255:0:0m**red text\033[0;00m" 

Esiste questo genere di cose?

Voglio solo utilizzare bash standard.

+1

Wikipedia ha un buon articolo su [ANSI escape codes] (http://en.wikipedia.org/wiki/ANSI_escape_code#graphics)! Ma, anche se dicono che c'è un modo per generare un output colorato RGB ('\ 033 [38; 2; r; g; bm'), non riesco a farlo funzionare sul mio terminale gnome. –

+2

Vale la pena menzionare: questo non ha nulla a che fare con 'bash'. Le sequenze di escape ANSI sono interpretate dal tuo * terminale * ('gnome-terminal',' xterm', 'konsole', ecc.). 'bash' è solo una * shell * (interprete dei comandi) lanciata dal tuo terminale. – MestreLion

risposta

42

Questo esiste, ma invece dei 16777216 (256^3) colori che l'OP cercava, ci sono 216 (6^3) colori equamente distribuiti, in un set più grande di 256 colori. Esempio:

echo -e "\033[38;5;208mpeach\033[0;00m" 

Questo emetterà un piacevole testo color pesca.


smontaggio questo comando: \ 033 [38; 5; 208m

Il \ 033 è il codice di escape. The [38; indirizza il comando allo in primo piano. Se invece vuoi cambiare il colore dello sfondo, usa [48; invece. The 5; è solo un pezzo della sequenza che cambia colore. E la parte più importante, 208m, seleziona il colore effettivo.


Ci sono 3 set di colori che possono essere trovati nella sequenza di 256 colori per questa fuga. Il primo set è il set di colori base "candy" o valori 0-15. Poi c'è un cubo di colori distribuiti, dal 16 al 311. Infine, è disponibile un set dettagliato in scala di grigi dalla 232-255.

potete trovare una tabella con tutti questi valori qui: http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your-Bash-Prompt-on-Linux#256%20(8-bit)%20Colors

+0

Trovo che '\ e' legge più facilmente di '\ 033' o '\ x1b' –

+0

@AaronJLang '\ e' non è supportato in tutte le shell. – Qix

+4

0-256 non è 256 colori; sono 257 colori! : P – HelloGoodbye

-3

No, non c'è.

E per il nitpick, quelli non sono tecnicamente "sequenze di escape ANSI" ma VT100 control codes (che erano definiti molto prima che esistessero terminali grafici e termini come "RGB").

+1

Sì, [c'è] (http://en.wikipedia.org/wiki/ANSI_escape_code), sebbene non sia supportato da molte shell. Invece di '38; 5', dovresti usare' 38; 2'. Ho appena provato in XTerm - funziona bene. – Qix

+0

@Qix È possibile impostare i colori, ma sto rispondendo alla domanda se è possibile impostare * colori RGB *, cioè colori arbitrari, il che non è possibile. –

+2

Non sei sicuro di dove stai ottenendo le tue informazioni, ma sì; guarda la mia risposta Colori RGB a 24 bit completi. – Qix

51

Entrambe le risposte qui non riescono a parlare del TruecolorANSI support per il colore 8bpc. Questo otterrà il colore RGB che l'OP originariamente richiesto.

Invece di ;5, utilizzare ;2, e specificare la R, G e B valori (0-255) nelle seguenti tre segmenti di controllo.

\x1b[38;2;40;177;249m 

Per provare if your terminal supports Truecolor:

printf "\x1b[38;2;40;177;249mTRUECOLOR\x1b[0m\n" 

Sulla mia macchina, XTerm felicemente emessi il colore corretto; sebbene, i terminali modellati dopo i terminali che precedono il moderno colore RGB in genere non supporteranno il truecolor: assicurati di conoscere il tuo obiettivo prima di utilizzare questa particolare variante del codice di escape.


Vorrei anche sottolineare la 38 e la ;5/;2 - Ice Blue mentioned che 38 percorsi e quindi 5 cambia il colore. Questo è leggermente errato.

38 è il codice colore in primo piano esteso xterm-256; 30 - 37 sono semplicemente codici in primo piano a 16 colori (con una luminosità controllata dal codice di escape 1 su alcuni sistemi e gli 90 - 97 codici "non luminosi" non supportati, supportati da tutti i terminali colorati conformi a vt100/xterm .

Il ;2 e ;5 indicano il formato del colore, in ultima analisi, dicendo al terminale quante più sequenze di tirare: ;5 specificare un formato a 8 bit (come detto Blue Ice) che richiede solo 1 più segmento di controllo, e ;2 specificando un formato RGB a 24 bit completo che richiede 3 segmenti di controllo.

Queste modalità estese sono tecnicamente "non documentate" e sono completamente implementate. Per quanto ne so e posso ricercare, sono non governati dal comitato ANSI.


Per il modo inclinato, il formato 5; (256 colori) inizia con i 16 colori originali (sia scuro/luce, così 30-37 e 90-97) come colori 0-15.

I successivi 216 colori (16-231) sono formati da un valore RGB di 3bpc sfalsato di 16, racchiuso in un unico valore.

Gli ultimi 24 colori (232-256) sono in scala di grigi a partire da una sfumatura leggermente più leggera del nero che va fino a una tonalità leggermente più scura del bianco. Alcuni emulatori interpretano questi passaggi come incrementi lineari da (256/24) su tutti e tre i canali, anche se mi sono imbattuto in alcuni emulatori che sembrano definire esplicitamente questi valori.

Questa è una funzione Javascript che esegue tale conversione, tenendo conto di tutti i grigi.

function rgbToAnsi256(r, g, b) { 
    // we use the extended greyscale palette here, with the exception of 
    // black and white. normal palette only has 4 greyscale shades. 
    if (r === g && g === b) { 
     if (r < 8) { 
      return 16; 
     } 

     if (r > 248) { 
      return 231; 
     } 

     return Math.round(((r - 8)/247) * 24) + 232; 
    } 

    var ansi = 16 
     + (36 * Math.round(r/255 * 5)) 
     + (6 * Math.round(g/255 * 5)) 
     + Math.round(b/255 * 5); 

    return ansi; 
} 

Così in un senso, è possibile calculate 256 ANSI colori da valori RGB iniziali di ridurli da 8 a 3 bit per formare un valore codificato 256 nel caso in cui si desidera programmazione farlo su terminali che non supportare Truecolor.

+0

Per i posteri, sono il manutentore del repository collegato in fondo a questo post. – Qix

2

Attualmente le sequenze di escape a colori (\ e [38; 2; R; G; Bm) sono supportate da alcuni emulatori di terminale incluso gnome-terminal (con vte> = 0,36), konsole e st [suckless].

La funzione è non supportata da alcuni altri, ad es. pterm [mastice], terminologia [illuminazione], urxvt.

xterm è a metà strada: riconosce le sequenze di escape, ma arrotonda ogni colore a quello più vicino nella tavolozza di 256 colori.

+0

Interessante factoid su Xterm. A quanto pare stanno facendo anche male. – Qix

Problemi correlati