[precedente] Creare CD - Copertina - Joe [successivo]

Articoli


OPEN

Giocare con i colori in bash

Una delle domande che probabilmente ci si pone quando si installa Linux è come fare per cambiare i colori di default della console.

I vari aspetti della questione sono esposti in un documento che tutti co noscono (almeno credo) e che prende il nome di Colours-ls.

Considerato che questo mostra in maniera un po' frammentaria come costruire ed utilizzare una sequenza di escape, ho ritenuto utile illustrare alcune possibilità di impiego, anche avvalendomi di esempi pratici.

ESC [ Nr.Colore_primo_piano;Nr.Colore_fondo;NUMEROm

Il ``NUMERO'' che precede la ``m'' alla fine del comando consente svariate combinazioni, vediamo le principali:

   0 = Default
   1 = Colore Evidente
   2 = Sottotraccia
   3 = Colore Normale
   4 = Sottotraccia
   5 = Colore In Primo Piano Lampeggiante
   7 = Reverse  (Il colore in primo piano diventa di fondo e viceversa.

Numeri dei colori In Primo Piano:

   l = Luminoso
   Nero=30
   Grigio=30;1m
   Rosso=31
   Rosso_l=31;1m
   Verde=32
   Verde_l=32;1m
   Marrone=33
   Giallo=33;1m
   Blu=34
   Blu_l=34;1m
   Viola=35
   Viola_l=35;1m
   Celeste=36
   Celeste_l=36;1m
   Bianco=37
   Bianco_l=371m

Numeri dei colori di fondo:

   Nero=40
   Rosso=41
   Verde=42
   Marrone=43
   Blu=44
   Viola=45
   Celeste=46
   Grigio=47

Per esempio:
echo -e "\033[33;44;1m Linux \033[0m" # Giallo su fondo Blu
echo -e "\033[33;44;3m Linux \033[0m" # Marrone su fondo Blu

Nel primo caso, il colore in primo piano è Giallo ed il fondo Blu, nel secondo invece abbiamo Marrone su Blu.

L'opzione ``-e'' consente al comando ``echo di interpretare correttamente i codici di escape, tuttavia considerato che questo non avviene in tutte le shell si può decidere di usare ``printf'':
printf "\033[31;44;1m Rosso Luminoso Su Blu \033[0m"

In questo altro esempio troviamo la scrittura in primo piano colorata in Giallo lampeggiante sul fondo Nero, mentre il codice di escape finale riporta tutto al default:
echo -e "\033[33;40;5m\033[1m Linux \033[0m"

Proviamo l' inversione dei colori (così ho il colore in primo piano Rosso ed il fondo Nero):
echo -e "\033[40;31;1m Linux \033[0m"

Mentre in questo altro modo ho Nero su Rosso:
echo -e "\033[40;31;7m Linux \033[0m"

Sempre sfruttando il reverse possiamo scrivere un ciclo while che ci disegni una banda rossa crescente in senso orizzontale:

  clear
  VAL=0
  echo -e "\n"
  while [ $VAL -lt 30 ]
  do
  echo -e "\033[31;7m \c"
  VAL=`expr $VAL + 1`
  done
  echo -e "\033[0m"

Ovviamente attraverso i codici di escape si possono fare altre cose, disegnare angoli, linee... e perfino posizionare il cursore dove vogliamo:

ESC [ Riga ; Colonna H

Volendo sfruttare questo sistema, il ciclo precedente diventerebbe:

  clear
  VAL=0
  COL=1
  while [ $VAL -lt 30 ]
  do
  echo -e "\033[01;"$COL"H  ";echo -e "\033[31;7m"
  VAL=`expr $VAL + 1`
  COL=`expr $COL + 1`
  done
  echo -e "\033[0m"

Di fatto esiste un'equivalenza fra il colore visualizzato attraverso i codici di escape e quello ottenibile attraverso il comando ``setterm'':
setterm -bold on -foreground white -background blue -store

Setta il colore in primo piano come ``Bianco evidente'' (opzione ``-bold on'' == 1m; ``-bold off'' == 0m) ed il colore di background in blu.

Ho lasciato volutamente alla fine i codici "2" e "4" che ho chiamato ``sottotraccia'' perché corrispondono ai colori settati rispettivamente con le opzioni ``hbcolor'' e ``ulcolor'' di ``setterm'':

 2m == hbcolor
 4m == ulcolor

Esempio:

 setterm -hbcolor red -ulcolor green -foreground cyan -background black -store

 echo -e "\033[40;1m Linux \033[0m"  # Colore im Primo Piano == Ciano
 echo -e "\033[40;2m Linux \033[0m"  # Colore im Primo Piano == Rosso
 echo -e "\033[40;4m Linux \033[0m"  # Colore im Primo Piano == Verde

Il Colours-ls riporta un ciclo ``for'' che visualizza tutti i colori ANSI, ho provato a fare un po' meglio scrivendo una shell grafica ed interattiva nella quale hanno trovato applicazione i concetti esposti.

Il programmino, setcolor.sh, disegnando diverse cartelline colorate, consente di provare svariati accostamenti cromatici ed a richiesta di renderli definitivi aggiungendo un ``setterm'' appropriato o cambiando quello esistente in .bash_profile.

Per una corretta visualizzazione occorre un giusto spostamento al modo grafico, almeno un ``setfont lat1u-16.psf'' ed un ``mapscrn iso01.uni'' o in alternativa un semplice ``setfont'' che carichi anche il sottoinsieme ``Unicode'' dei caratteri grafici.

di Paolo Bongiorno


[precedente] Creare CD - Copertina - Joe [successivo]