Le sequenze di escape del colore del terminale sono definite ovunque per bash?


22

Ho usato ogni tanto i colori negli script di Bash (principalmente su CentOS), ma per rendere il loro utilizzo più comodo finisco per ridefinire le variabili in valori di colore:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

o anche con tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

Ho sfogliato la /etc/rc.d/init.ddirectory ma non ho trovato nulla di correlato alle definizioni dei colori.

Esiste già una tale definizione? Altrimenti li metterei in un file /etc/rc.d/init.dper dire, e lo includerei nei miei script, un po 'come con/etc/rc.d/init.d/functions


Non sono, perché \e[1;30m, ad esempio, non rappresentano tecnicamente il grigio, ma piuttosto la fessura di colore normalmente visualizzata come grigia da un terminale. Gli emulatori di terminale sono liberi di modificare i colori effettivi del display e spesso li rendono un'opzione configurabile dall'utente.
Chepner,

Risposte:


36

Ci sono molti aspetti in gioco in quello che stai chiedendo.

Innanzitutto, bash non definisce i colori. In effetti bash non ha assolutamente idea dell'esistenza dei colori. Tutto quello che sa è che gli hai detto di produrre i personaggi \033[0;36m. Il tuo emulatore di terminale (xterm, gnome-terminal, qualunque cosa) riceve questi caratteri e capisce "Devo iniziare a produrre ciano".

Quindi è l'emulatore di terminale che comprende i colori. Il tuo emulatore di terminale capisce che \033[0;36mè ciano, ma un altro emulatore di terminale potrebbe usare un set di caratteri completamente diverso per il ciano (anche se nessun emulatore di terminale sensato sfoggerebbe lo standard e lo farebbe). Questo è il motivo tput. Quando esegui tput setaf 6, tputcerca i codici di escape del tuo terminale per il colore 6 (ciano) e genera quel codice di escape.
(vedi questa domanda per maggiori informazioni sui tput setafcodici)

Ora torniamo a bash. Come avrete notato, quando sono stato riferisco al colore ciano, ho usato \033[0;36m, non è \[\033[0;36m\]. Mancano le parentesi quadre. Lo scopo delle parentesi quadre è che quando si usano i codici di escape (colori) nel prompt, bash deve sapere quali caratteri non sono in stampa (larghezza zero, in realtà non mostrano nulla). Quindi racchiudi i caratteri non stampabili in \[ \]. Se rimuovi questi caratteri, tutto potrebbe sembrare che funzioni bene all'inizio, ma inizierai a correre in tutti i tipi di stranezze quando il tuo comando supera la larghezza del terminale. Questo perché durante la digitazione, bash deve sapere quando il comando dovrebbe passare alla riga successiva. Per fare ciò, calcola la larghezza del prompt e quindi la larghezza di quanto hai digitato.

Un'altra nota, circa tput. nonCYAN="\[\033[0;36m\]" è la stessa cosa di . Come abbiamo appena discusso, le parentesi quadre sono rilevanti per bash e produrranno solo i codici di escape del terminale.CYAN="$(tput setaf 6)"tput

Poiché le parentesi quadre sono in genere rilevanti solo nel prompt, se stai usando i colori nell'output di uno script o qualcosa del genere, non dovresti usarli. Ciò significa che se si utilizzano i colori per più di prompt, è necessario definire più variabili. Uno con parentesi quadre da utilizzare nel prompt e uno senza tutto il resto. Sebbene sia possibile aggiungere manualmente le parentesi quadre ogni volta che si fa riferimento a un colore nel prompt.

Per farla breve, probabilmente vorrai definire qualcosa del tipo:

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"

Come vedo i colori quando accedo a un terminale reale con Ctrl+ Alt+ F1?
Serge Stroobandt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.