Avanti Indietro Indice

5. Sequenze di escape ANSI: Colori e Movimenti del Cursore

5.1 Colori

Come menzionato prima, i caratteri di escape non stampabili devono essere racchiusi da \[\033[ e \]. Per le sequenze di escape, devono anche essere seguiti da m minuscola.

Se provate i prompt seguenti in un xterm e trovate che non vedete i colori menzionati, controllate nel file ~/.Xdefaults (e possibilmente gli altri con simile funzione) le linee come "XTerm*Foreground: BlanchedAlmond". Questo può essere commentato mettendo un punto esclamativo ("!") davanti. Ovviamente questo dipenderà anche da che emulatore di terminale state usando. Questo è il posto più probabile in cui i colori del vostro terminale possono essere reimpostati.

Per includere del testo blu nel prompt:

PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "

Il problema con questo prompt è che il colore blu che inizia con il codice-colore 34 non viene mai cambiato nuovamente al normale colore, così il testo digitato dopo il prompt è ancora nel colore del promot. Questa è una tonalità di blu scura, unendola con il codice bold (grassetto) potrebbe aiutare:

PS1="\[\033[1;34m\][\$(date +%H%M)][\u@\h:\w]$\[\033[0m\] "

Il prompt è ora blu chiaro e termina cambiando il colore nuovamente a nulla (quale che fosse il colore di primo piano che avevate prima)

Questo sono i restanti valori dei colori:

Nero           0;30     Grigio Scuro  1;30
Blu            0;34     Blu Chiaro    1;34
Verde          0;32     Verde Chiaro  1;32
Ciano          0;36     Ciano Chiaro  1;36
Rosso          0;31     Rosso Chiaro  1;31
Viola          0;35     Viola Chiaro  1;35
Marrone        0;33     Giallo        1;33
Grigio Chiaro  0;37     Bianco        1;37

Potete anche impostare i colori dello sfondo usando 44 per uno sfondo blu, 41 per uno sfondo rosso, ecc. Non ci sono colori dello sfondo in grassetto (bold). Possono essere usate delle combinazioni, come testo Rosso Chiaro su uno sfondo Blu: \[\033[44;1;31m\], sebbene impostare i colori separatamente sembra funzionare meglio (cioè \[\033[44m\]\[\033[1;31m\]). Gli altri codici disponibili includono 4: Sottolineatura, 5: Lmpeggiante, 7: Negativo, e 8: Nascosto.

In oltre: Molti (incluso me stesso) si oppongono fermamente all'attributo "blink". Fortunatamente, non funziona in ogni emulatore di terminale che conosco - ma funziona alla consolle. E, se vi state chiedento (come ho fatto io) "A cosa serve un attributo 'Nascosto'?!" - l'ho visto usato in un esempio di uno shell script (non un prompt) per permettere di digitare una password senza visualizzarla sullo schermo.

Basato su un prompt chiamato "elite2" nel pacchetto Bashprompt (che ho modificato per funzionare meglio su una consolle standard, piuttosto che con i font speciali di xterm richiesti per vedere bene l'originale), questo è un prompt che ho usato molto:

 
function elite
{

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

case $TERM in
    xterm*)
        local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
        ;;
    *)
        local TITLEBAR=""
        ;;
esac

local GRAD1=$(tty|cut -d/ -f3)
PS1="$TITLEBAR\
$GRAY-$CYAN-$LIGHT_CYAN(\
$CYAN\u$GRAY@$CYAN\h\
$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
$CYAN\#$GRAY/$CYAN$GRAD1\
$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
$CYAN\$(date +%H%M)$GRAY/$CYAN\$(date +%d-%b-%y)\
$LIGHT_CYAN)$CYAN-$GRAY-\
$LIGHT_GRAY\n\
$GRAY-$CYAN-$LIGHT_CYAN(\
$CYAN\$$GRAY:$CYAN\w\
$LIGHT_CYAN)$CYAN-$GRAY-$LIGHT_GRAY " 
PS2="$LIGHT_CYAN-$CYAN-$GRAY-$LIGHT_GRAY "
}

Io definisco i colori come variabili temporanee della shell per leggibilità. È più facile lavorarci. La variablie "GRAD1" è un controllo per determinare in che terminale ci si trova, come il controllo per determinare se ci si trova su un Xterm, è sufficiente farlo una sola volta. Il prompt che vedrete ha questo aspetto, ma a colori:

--(giles@nikola)-(75/ttyp7)-(1908/12-Oct-98)--
--($:~/tmp)--

Per aiutarmi a ricordare quali colori sono disponibili, ho scritto lo script seguente che visualizza tutti i colori sullo schermo:


#!/bin/bash
#
#   Questo file stampa molti codici-colore sul terminale per
#   mostrare quali sono disponibili. Ogni linea e` un colore su sfondo
#   nero o grigio, con il colore nel mezzo. E` verificato che funziona con 
#   sfondo bianco, nero e verde (2 dic 98).
#
echo "  On Light Gray:        On Black:"
echo -e "\033[47m\033[1;37m  White        \033[0m\
 1;37m \
\033[40m\033[1;37m  White        \033[0m"
echo -e "\033[47m\033[37m  Light Gray   \033[0m\
   37m \
\033[40m\033[37m  Light Gray   \033[0m"
echo -e "\033[47m\033[1;30m  Gray         \033[0m\
 1;30m \
\033[40m\033[1;30m  Gray         \033[0m"
echo -e "\033[47m\033[30m  Black        \033[0m\
   30m \
\033[40m\033[30m  Black        \033[0m"
echo -e "\033[47m\033[31m  Red          \033[0m\
   31m \
\033[40m\033[31m  Red          \033[0m"
echo -e "\033[47m\033[1;31m  Light Red    \033[0m\
 1;31m \
\033[40m\033[1;31m  Light Red    \033[0m"
echo -e "\033[47m\033[32m  Green        \033[0m\
   32m \
\033[40m\033[32m  Green        \033[0m"
echo -e "\033[47m\033[1;32m  Light Green  \033[0m\
 1;32m \
\033[40m\033[1;32m  Light Green  \033[0m"
echo -e "\033[47m\033[33m  Brown        \033[0m\
   33m \
\033[40m\033[33m  Brown        \033[0m"
echo -e "\033[47m\033[1;33m  Yellow       \033[0m\
 1;33m \
\033[40m\033[1;33m  Yellow       \033[0m"
echo -e "\033[47m\033[34m  Blue         \033[0m\
   34m \
\033[40m\033[34m  Blue         \033[0m"
echo -e "\033[47m\033[1;34m  Light Blue   \033[0m\
 1;34m \
\033[40m\033[1;34m  Light Blue   \033[0m"
echo -e "\033[47m\033[35m  Purple       \033[0m\
   35m \
\033[40m\033[35m  Purple       \033[0m"
echo -e "\033[47m\033[1;35m  Pink         \033[0m\
 1;35m \
\033[40m\033[1;35m  Pink         \033[0m"
echo -e "\033[47m\033[36m  Cyan         \033[0m\
   36m \
\033[40m\033[36m  Cyan         \033[0m"
echo -e "\033[47m\033[1;36m  Light Cyan   \033[0m\
 1;36m \
\033[40m\033[1;36m  Light Cyan   \033[0m"

5.2 Movimenti del Cursore

Le sequenze di escape ANSI permettono di muovere il cursore a piacere sullo schermo. Questo è più utile per interfacce utente a tutto schermo generate da shell script, ma possono essere usate anche nei prompt. Le sequenze di escape di movimento sono le seguenti:

- Posizione del cursore:
  \033[<L>;<C>H
  mette il cursore alla linea L e colonna C.
- Muove il cursore su N linee:
  \033[<N>A
- Muove il cursore giù N linee:
  \033[<N>B
- Muove il cursore avanti N colonne:
  \033[<N>C
- Muove il cursore indietro N colonne:
  \033[<N>D

- Salva la posizione del cursore:
  \033[s
- Ripristina la posizione del cursore:
  \033[u

Gli ultimi due codici NON SONO supportati da molti emulatori di terminale. Gli unici che so che lo fanno sono xterm e nxterm - anche se la maggior parte degli emulatori di terminale sono basati sul codice di xterm. Da quanto ho potuto vedere rxvt, kvt, xiterm, e Eterm non li supportano. Sono supportati alla consolle.

Provate a digitare le seguenti linee di codice al prompt (cosa fa è un po' più chiaro se il prompt è alcune linee giù nel terminale quando lo digitate): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D". Questo dovrebbe muovere il cursore sette linee su per lo schermo, stampare la parola " BASH ", e poi tornare dov'era per produrre un normale prompt. Questo non è un prompt: è solo una dimostrazione di come muovere il cursore sullo schermo, usando il colore per evidenziare quanto viene fatto.

Salvate questo in un file chiamato "clock":


#!/bin/bash

function prompt_command {
let prompt_x=$COLUMNS-5
}

PROMPT_COMMAND=prompt_command

function clock {
local       BLUE="\[\033[0;34m\]"
local        RED="\[\033[0;31m\]"
local  LIGHT_RED="\[\033[1;31m\]"
local      WHITE="\[\033[1;37m\]"
local  NO_COLOUR="\[\033[0m\]"
case $TERM in
    xterm*)
        TITLEBAR='\[\033]0;\u@\h:\w\007\]'
        ;;
    *)
        TITLEBAR=""
        ;;
esac

PS1="${TITLEBAR}\
\[\033[s\033[1;\$(echo -n \${prompt_x})H\]\
$BLUE[$LIGHT_RED\$(date +%H%M)$BLUE]\[\033[u\033[1A\]
$BLUE[$LIGHT_RED\u@\h:\w$BLUE]\
$WHITE\$$NO_COLOUR "
PS2='> '
PS4='+ '
}

Questo prompt è piuttosto semplice, ma tiene un orologio nell'angolo in alto a destra del terminale (anche se il terminale viene ridimensionato). Questo NON funzionerà negli emulatori di terminale che, come ho menzionato, non accettano i codici per salvare e ripristiare la posizione del cursore. Se provate ad usare questo prompt in uno di quegli emulatori di terminale, l'orologio apparirà correttamente, ma il prompt verrà intrappolato nella seconda linea del terminale.

Vedi anche Il Prompt Orologio Inutile ed Elegante per un uso più esteso di questi codici.

5.3 Muovere il Cursore Con tput

Come molte cose in Unix, c'è più di un modo per raggiungere gli stessi fini. Una utility chiamata "tput" può essere usata anche per spostare il cursore sullo schermo, o per ottenere informazioni sullo stato di un terminale. "tput", per posizionare il cursore, è meno flessibile delle sequenze di escape ANSI: si può muovere il cursore solo ad una posizione assoluta, non si può relativamente alla sua posizione corrente. Non uso "tput", quindi non intendo spiegarlo in dettaglio. Digitate "man tput" e ne saprete quanto me.


Avanti Indietro Indice