Tra tutte le variabili d'ambiente della shell Bash, PS1 è probabilmente una delle più versatili e personalizzabili, ed i suoi effetti possono essere osservati immediatamente.
PS1, infatti, non è altro che la "struttura" del prompt della shell, e la sua modifica equivale all'utilizzo del comando prompt nel DOS o nelle sue emulazioni recenti in sistemi operativi Microsoft come Windows XP, Windows Vista o Windows 7.
Prima di cominciare, ricordate che il prompt classico di Bash
user@localhost:~$
Contiene molte informazioni, e se doveste commettere degli errori potreste vederlo confuso o mal posto, come
user@\[033[\\h:
Il che non è né bello da vedere, né granchè utilizzabile. Sebbene a Bash non interessi che cosa sta scritto nel prompt, per l'utente potrebbe importare molto sapere dove si trova nell'albero delle directory, con quale nome è connesso e a che macchina. Quindi nel corso dell'articolo vi insegnerò anche a porre rimedio ad eventuali problemi in cui potreste inciampare.
Ricordate anche che un prompt come il seguente
bash-x.x#
È il default di Bash quando nessun altro prompt è definito. Equivale a porre
PS1='\s-\v\$ '
Dove x.x (l'elemento \v) sono i numeri di versione major e minor di Bash.
Nella vostra distribuzione il valore "standard" di PS1 viene esposto con
echo $PS1
Probabilmente vi troverete confusi, perché quello che avete appena visto non corrisponde esattamente al prompt di Bash. A questo punto bisogna introdurre degli elementi (che chiameremo "riferimenti") che Bash interpreta come variabili e che sostituisce nel prompt, definito da PS1.
Prima di tutto diamo un'occhiata al valore di default di PS1 in distribuzioni comuni come Slackware o Ubuntu:
\u@\h:\w\$
(Non si vede, ma alla fine della stringa c'è uno spazio. Potete visualizzarlo posponendo un carattere visibile all'espansione di PS1, come ad esempio echo $PS1\<.)
Analizziamo adesso i riferimenti nel valore di default.
I due punti (: ) e la chiocciola (@) sono semplici separatori che possono essere sostituiti con qualsiasi altro carattere, tranne una backslash singola (\).
Nota [1]: il prompt di Bash, e quindi la variabile PS1, si può trattare come qualsiasi altra variabile della shell, ed è quindi possibile usare delle sostituzioni con $() o apici inversi (``) in PS1.
Nota [2]: PS1, essendo una variabile, può essere usata in qualsiasi contesto o in qualsiasi script, e modificata a piacere.
Nota [3]: il valore di default di PS1 potrebbe cambiare da distribuzione a distribuzione; l'esempio di PS1 sopra riportato è il contenuto di default della variabile nella Slackware e nelle versioni precedenti di Ubuntu.
Potete cambiare il contenuto di PS1 come volete, ricordando che essa tornerà normale non appena uscirete dalla shell. I cambiamenti a PS1 infatti non vengono salvati finchè non ne viene variato il valore nei file di configurazione di Bash. Fate riferimento alla sezione "Rendere definitivi i cambiamenti".
Per cui, se avete commesso degli errori di assegnazione di PS1 o se il prompt non vi soddisfa potete riassegnarne il valore di default. Se non sapete a priori qual è potete creare una variabile temporanea che contenga il prompt:
PS1_TEMP=$PS1
Se poi volete tornare al valore di default non dovete fare altro che riassegnare il contenuto di PS1_TEMP a PS1:
PS1=$PS1_TEMP
E rimuovere poi PS1_TEMP dalla memoria:
unset PS1_TEMP
I riferimenti utilizzabili in PS1 non sono molti, ma fra questi posso citare i seguenti:
Potete mettere tutti i riferimenti che volete, ma non "farcite" troppo il prompt o finirete con il non capire più dove siete, chi siete o che cosa state facendo...
Nelle prossime due pagine spegherò anche come cambiare i codici di colore del prompt; se volete provare subito a vedere (o sperimentare) qualche esempio potete andare direttamente a leggere questa appendice dell'articolo.
Credevate che fosse finito? E invece no!
Bash permette un livello di personalizzazione del prompt che deriva direttamente dalla sua capacità di colorare l'output testuale degli script tramite echo e l'uso del carattere di escape \033 o \e. Per fare questo dobbiamo imparare delle strutture di testo, ricordando una semplice regola di base: cambiando colore ad un carattere, il colore durerà fino a che non verrà cambiato nuovamente.
In poche parole, se per esempio vogliamo far tornare al colore di default il prompt (grigio chiaro se su sfondo nero, come in konsole o in un terminale virtuale, nero se su sfondo bianco come in gnome-terminal o in xterm), glielo dobbiamo dire esplicitamente. D'ora in poi chiamerò i numeri che identificano i colori di Bash con l'espressione "codice di colore". La struttura per inizializzare il colore è \033[, oppure \e[; per terminare i codici colore usate invece il carattere m. Cominciate una struttura di colore con il riferimento \[ e terminatela con il riferimento \]. Se non lo farete il vostro terminale potrà comportarsi in modo del tutto inaspettato...
Di seguito riporto una lista di codici di colore utilizzabili. Notate che i codici sono tantissimi e questa lista non è affatto completa, in quanto prende in considerazione una piccola parte dei colori rappresentabili da un terminale.
I due numeri che definiscono un codice di colore possono assumere un qualsiasi valore intero positivo (sebbene io ne ignori i limiti), ciononostante ho preferito riportare per semplicità una serie di codici che può andar bene per rappresentare una varietà sufficiente di colori.
... eccetera. I codici sono tantissimi e qui c'e n'è solo una piccola parte. Ho calcolato che potrebbero essercene all'incirca 2000. Lascerò agli utenti la curiosità (se c'è) di scoprirne altri, o di cercare i colori o le combinazioni che più piacciono.
Ricordate solo che esistono dei codici (come 0;12) che possono rendere il prompt o il terminale illeggibile, trascrivendolo in caratteri greci o cirillici. Casomai doveste trovarne uno simile potete usare il comando reset per ridare sanità al terminale. Fate riferimento alla pagina degli esempi per ulteriori informazioni sul garbled terminal.
Se ora volete provare un codice di colore qualsiasi su una stringa (in questo caso [Hello]) potete farlo direttamente con echo senza chiamare in causa PS1 per provare quale colore vi piace di più. Scrivete (riportandolo esattamente, preferibilmente con un copia/incolla) e confermate questo comando:
echo -e "\[\e[<codice>m\][Hello]\[\e[0m\]"
Sostituendo a <codice> il codice di colore che volete provare. Quando lo avrete scelto (o se ne avrete scelti più di uno) segnatevelo per non dimenticarlo, e potrete andare subito a modificare PS1 dal suo valore di default a quello che avete scelto con una semplice assegnazione. Prendiamo ad esempio una PS1 standard esposta all'inizio dell'articolo:
\u@\h:\w\$
E, dopo aver salvato la variabile in una porzione di memoria separata come descritto in questa pagina, aggiungiamo solo i colori conservando tutti i riferimenti:
PS1='\[\e[<codice1>m\]\u\[\e[0m\]@\[\e[<codice2>m\]\h\[\e[0m\]:\[\e[<codice3>m\]\w\[\e[0m\]\$ '
Nota [1]: Può sembrare complicato all'inizio, ma una volta che ci si fa l'abitudine si impara a "spezzare" il valore in frammenti più semplici. Tenete presente le strutture fondamentali e mettetele insieme secondo le regole che avete letto, e il prompt sarà sempre corretto.
Nota [2]: in fase di assegnazione il valore di PS1 deve essere racchiuso tra apici singoli (o apostrofi) affinché i caratteri non stampabili (e quindi i codici di colore) abbiano effetto. Per Bash chiudere qualcosa tra ' ' e tra " " non è equivalente.
Nota [3]: la struttura di chiusura \e[0m serve solo a "chiudere" il colore; se volete lasciare tutte le sezioni del prompt dello stesso colore potete metterla solo alla fine. In questo esempio @, : e \$ sono tutti e tre di colore grigio chiaro.
Nota [4]: come avrete intuito, non è necessario usare un codice colore solo.
Nota [5]: nel caso non ve lo ricordiate, \e[ e \033[ sono equivalenti.
Notate che ho messo apposta <codice1>, <codice2>, <codice3>, affinché possiate, dopo aver scelto (se volete) tre codici colore differenti, suddividere il prompt in sezioni di colori diversi. In questo caso avrete un colore per il nome utente (\u), uno per l'hostname (\h) e uno per il percorso alla directory corrente (\w).
Se volete sperimentare subito qualche esempio pratico di cambio colore potete andare a leggere questa pagina, oppure potete andare avanti a leggere come rendere definitivi i cambiamenti al prompt della shell.
Se avrete seguito se mie istruzioni alla lettera, senza errori nella trascrizione di PS1 e volete avere il vostro nuovo prompt personalizzato senza doverlo riassegnare ad ogni riavvio o ad ogni istanza di Bash, potete passare a renderlo definitivo, agendo su file di configurazione che possono essere diversi da distribuzione a distribuzione.
Per sicurezza fate prima delle copie di backup di questi file (non sono importantissimi, ma è comunque una buona idea):
sudo cp /etc/bash/bashrc{,.old}
Per Gentoo, oppure per Ubuntu
cp ~/.bashrc{,.old}
Oppure
sudo cp /etc/profile{,.old}
Per entrambe le distribuzioni. Per trovare la variabile potete aprire un comune editor di testo e fare una ricerca con PS1 (tutto maiuscolo) come parola chiave.
Probabilmente personalizzare PS1 non è la cosa più utile del mondo, ma può fare piacere alle persone che vogliono un po' più di colore nel loro terminale, o a utenti che si sono stufati di vedere sempre il solito bianco e le solite cose...
PROMPT_DIRTRIM è una variabile di ambiente Bash, a effetto immediato, che influisce sul riferimento \w in PS1. Se è definita con un valore numerico intero positivo, esso determina il numero di directory superiori da visualizzare nel prompt; il resto del percorso è sostituito da tre puntini.
Per esempio, avendo un utente user, un hostname localhost ed un PS1 come questo:
\u@\h:\w\$
Definendo
PROMPT_DIRTRIM=1
Ed entrando nella directory /home/temp/source il prompt sarà il seguente:
user@localhost:.../source$
Con le stesse caratteristiche, definendo
PROMPT_DIRTRIM=2
Il prompt si trasformerà in
user@localhost:.../temp/source$
PROMPT_DIRTRIM è una variabile Bash, ed è quindi attiva fino a che non si esce dalla shell in cui è stata definita. Per renderla definitiva è necessario esportarla con il comando export (esaminato in questo articolo) in uno dei file di configurazione descritti nella pagina precedente. Essa può essere estremamente utile per rendere più leggibile il prompt che visualizza PWD, con riferimento \w. In particolare, PROMPT_DIRTRIM=1 è equivalente (eccetto i tre punti) a sostituire \w con \W in PS1.
Adesso passiamo a qualche esempio pratico. Potete aprire un terminale in X usando uno dei vari emulatori disponibili per le varie GUI (gnome-terminal per GNOME, oppure konsole per KDE, o anche un semplice xterm, che dovrebbe andare bene per qualsiasi distribuzione) oppure potete spostarvi subito in un terminale testuale usando la combinazione Ctrl+FX (come descritto in questo articolo, ma dovrete stare molto attenti al codice 0;12 come spiegato sotto). Nel secondo caso potreste dover effettuare un login, e personalmente vi consiglio di accedere come utente normale, minimizzerete la possibilità di combinare disastri nel sistema.
Fate quindi un backup della variabile PS1 con il procedimento descritto in questa pagina, e sarete pronti per cominciare e sbizzarrirvi con i riferimenti, i parametri, le strutture e i codici di colore che ho spiegato fino adesso. Tenete anche presente la pagina su come rendere effettivi i cambiamenti.
Comunque, se non siete sicuri di quello che state per fare o se volete dei "template" su cui lavorare potete fare riferimento a quelli che elencherò di seguito: sentitevi liberi di modificarli come meglio vi aggrada.
Nota [1]: con xterm i codici di colore potrebbero non avere lo stesso effetto che in un terminale virtuale.
Questa la dovreste trovare di default in una distribuzione Gentoo; in ogni caso potete copiarla e imitarla nella vostra distribuzione. È un semplice verde/blu con degli spazi per distinguere meglio la directory.
PS1='\[\e[1;32m\]\u@\h\[\e[1;34m\] \w \$\[\e[0m\] '.
Questo è di default in distribuzioni come la Slackware, è molto semplice e non ha colore, ma è completa.
PS1='\u@\h:\w\$ '
Differenziamo nome utente, nome macchina e directory corrente con rosso, blu e verde rispettivamente, lasciando i separatori con il colore di default, e degli spazi tra riferimenti e separatori.
PS1='\[\e[0;31m\]\u\[\e[0m\] @ \[\e[0;34m\]\h\[\e[0m\] : \[\e[0;32m\]\w\[\e[0m\] \$ '
Nota [2]: come potete notare, gli spazi hanno il significato letterale e non è necessario anteporre un backslash (\) per renderli tali (in questo caso).
Nota [3]: nella rappresentazione degli spazi di Bash gli apici singoli (' ') e i doppi apici (" ") hanno lo stesso significato.
Come il precedente, ma aggiungiamo l'ora (ore e minuti, formato 24 ore con il riferimento \A) con un colore ciano, e racchiusi da delle parentesi tonde dello stesso colore dell'ora.
PS1='\[\e[0;36m\](\A)\[\e[0m\] \[\e[0;31m\]\u\[\e[0m\] @ \[\e[0;34m\]\h\[\e[0m\] : \[\e[0;32m\]\w\[\e[0m\] \$ '
Anche qui vedete che le parentesi tonde hanno significato letterale e non sono precedute da backslash. Ho volutamente lasciato degli spazi per rendere più leggibile la variabile, che ora proviamo a scomporre.
Potete facilmente notare come i riferimenti (\u, \h, \A, \w) siano "incastonati" all'interno delle strutture di colore. Quindi ogni "frammento" del prompt che abbia colore deve seguire questa indicazione:
\[\e[<colore>m\]<stringa><riferimento><stringa><riferimento><...><\[\e[0m\]>
L'ultima struttura \[\e[0m\] è opzionale e serve solo per lasciare il terminale al colore di default o per cambiare colore. Il numero (e il tipo) dei riferimenti e delle stringhe letterali è irrilevante ed è lasciato ai vostri gusti personali.
Nota [4]: se non riportate il colore allo stato di default tutti i caratteri dei comandi da terminale avranno l'ultimo colore specificato in PS1, o l'ultimo colore provato con echo in questa pagina (che non sia stato successivamente azzerato con \[\e[0m\]). Quindi potete non solo colorare il prompt, ma anche gli output degli script e le lettere stesse dei comandi che scrivete.
Nota [5]: per riportare i colori dei caratteri del terminale allo stato di default dovete ripristinare la vecchia variabile PS1 o, in alternativa, uscire dall'istanza corrente di Bash.
Teniamo il prompt precedente e aggiungiamo un piccolo commento, con il colore di default, all'ora, e la data di oggi subito dopo, separata da una virgola e colorata di arancio, all'interno delle stesse parentesi.
PS1='(sono le \[\e[0;36m\]\A\[\e[0m\], \[\e[0;33m\]\d\[\e[0m\]) \[\e[0;31m\]\u\[\e[0m\] @ \[\e[0;34m\]\h\[\e[0m\] : \[\e[0;32m\]\w\[\e[0m\] \$ '
Qui l'unica aggiunta rispetto al prompt precedente sono state la data e l'ora, in due colori diversi. Come vedete non c'è nulla di difficile; bisogna solo fare attenzione alle strutture e scrivere tutti i caratteri correttamente e al posto giusto.
Vi ricordate quando vi ho detto che è meglio non usare il codice 0;12? Questo è un terminale in cui, in qualsiasi punto di PS1, è stato usato il codice 0;12 o è stato esposto con echo.
Il rimedio, nel caso dell'esposizione con echo, è molto semplice, e come ho già detto basta invocare reset per riportare il terminale a valori sani. In ogni caso il terminal garbling ha effetto solo su terminali virtuali (quelli raggiungibili con Ctrl+FX) e non su pseudoterminali (quelli richiamabili da X come xterm, gnome-terminal e konsole). Può essere un trucchetto per confondere le idee alla gente... : ).
Se invece il codice 0;12 è all'interno di PS1 avete fatto un danno, perché ad ogni comparsa del prompt nella shell vedrete scritti caratteri confusi. Il semplice reset non basterà più, e vi converrà uscire dalla shell attuale con exit e rifare il login, ricordando due cose:
Nota [6]: Se avrete salvato 0;12 in un file di configurazione di Bash in PS1 in modo definitivo (e avrete già riavviato il sistema) le uniche cose che potete fare sono modificare la configurazione da GUI e, se non avete GUI, vi conviene usare un LiveCD per rimuovere il codice "dispettoso". Oppure usare un procedimento un po' macchinoso, ma efficace:
[1] - Rendere PS1 nulla con PS1='' oppure PS1=;
[2] - usare reset per ripristinare il terminale;
[3] - ripristinare un prompt sano oppure usare il default con PS1='\u@\h:\w\$ ' o PS1='\s-\v\$ '.
Potrete poi uscire dalla shell senza paura oppure modificare in tutta tranquillità il file di configurazione dove PS1 è stata "sabotata", facendola ritornare ad un valore accettabile.
Questo lo lascio interpretare a voi.
PS1='$USER@$(hostname -s):$PWD\$ '
Suggerimento [1]: l'espansione di variabile è quella cosa che fa vedere il contenuto di una variabile all'utente, e può essere fatta anche tramite echo.
Suggerimento [2]: la sostituzione di comandi è quella cosa che succede quando racchiudete un comando tra $() o apici inversi ``, in cui Bash non interpreta il comando ma il suo output.
Suggerimento [3]: usate questo articolo come fonte di informazioni.
Suggerimento [4]: valgono tutte le regole su colori e strutture finora elencate in questo articolo.
MegaLab.it rispetta la tua privacy. Per esercitare i tuoi diritti scrivi a: privacy@megalab.it .
Copyright 2008 MegaLab.it - Tutti i diritti sono riservati