Ho usato ogni tanto i colori negli script di Bash (principalmente su CentOS), ma per rendere il loro utilizzo più comodo finisco per ridefinire variabili ai 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 esplorato il /etc/rc.d/init.d
directory ma non ho trovato nulla relativo alle definizioni dei colori.
Esiste già una definizione del genere? In caso contrario, li metterei in un file in /etc/rc.d/init.d
per dire, e includerlo nei miei script, un po' come con /etc/rc.d/init.d/functions
Risposta accettata:
Ci sono diversi aspetti in gioco in ciò che chiedi.
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 caratteri \033[0;36m
. Il tuo emulatore di terminale (xterm, gnome-terminal, qualunque cosa) riceve questi caratteri e capisce "Ho bisogno di iniziare l'output in cyan".
Quindi è il tuo emulatore di terminale che comprende i colori. L'emulatore di terminale comprende che \033[0;36m
è ciano, ma un altro emulatore di terminale potrebbe utilizzare un set di caratteri completamente diverso per ciano (sebbene nessun emulatore di terminale sano osserverebbe lo standard e lo farebbe). Questo è il motivo di tput
. Quando esegui tput setaf 6
, tput
cercherà i codici di escape del tuo terminale per il colore 6 (ciano) e produrrà quel codice di escape.
Ora torna a bash. Come avrai notato, quando mi riferivo al colore ciano, ho usato \033[0;36m
, non \[\033[0;36m\]
. Mancano le parentesi quadre. Lo scopo delle parentesi quadre è che quando si utilizzano i codici di escape (colori) nel prompt, bash deve sapere quali caratteri non sono stampabili (larghezza zero, in realtà non mostra nulla). Quindi racchiudi i caratteri non stampabili in \[
\]
. Se rimuovi questi caratteri, all'inizio potrebbe sembrare che tutto funzioni bene, ma inizierai a imbatterti in ogni sorta di stranezza quando il tuo comando supera la larghezza del terminale. Questo perché durante la digitazione, bash deve sapere quando il comando dovrebbe andare a capo alla riga successiva. Per fare ciò, calcola la larghezza del prompt, quindi la larghezza di quanto hai digitato.
Un'altra nota, su tput
. CYAN="\[\033[0;36m\]"
è non la stessa cosa di CYAN="$(tput setaf 6)"
. Come abbiamo appena discusso, le parentesi quadre sono rilevanti per bash e tput
produrrà solo i codici di escape del terminale.
Poiché le parentesi quadre di solito sono 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 hai intenzione di utilizzare i colori per più dei prompt, devi definire più variabili. Uno con parentesi quadre per l'utilizzo nel prompt e uno senza per tutto il resto. Sebbene tu possa semplicemente aggiungere manualmente le parentesi quadre ogni volta che fai riferimento a un colore nel prompt.
Per farla breve, probabilmente vorrai definire qualcosa come:
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\]"