Avanti Indietro Indice

2. Bash e i Prompt Bash

2.1 Cosa è Bash

Discendente dalla Bourne Shell, Bash è un progetto GNU, la "Bourne Again SHell". È l'interfaccia a linea di comando standard su molte macchine Linux. Eccelle in interattività, nel supportare modifica, completamento e richiamo della linea di comando. Supporta anche prompt configurabili - molti lo sanno, ma non sanno quanto si può fare.

2.2 Quali sono i vantaggi di modificare il prompt?

La maggior parte dei sistemi Linux hanno un prompt predefinito in un colore (di solito grigio) che dice il vostro nome utente, il nome della macchina su cui lavorate e qualche indicazione sulla directory di lavoro corrente. Queste sono tutte informazioni utili, ma si può fare molto di più con il prompt: ogni genere di informazione può essere visualizzata (numero di tty, ora, data, carico della macchina, numero di utenti, uptime ...) e il prompt può utilizzare colori ANSI, per farlo apparire interessante, o per fare sì che certe informazioni siano evidenti. È anche possibile manipolare la barra del titolo di un Xterm per visualizzare alcune di queste informazioni.

2.3 Perché darsi tante noie?

Oltre che essere bello, è spesso utile tenere traccia delle informazioni di sistema. Una idea che so piace a molti è la possibilità di mettere su macchine differenti prompt con colori differenti. Se avete diversi Xterm aperti su macchine differenti, o se tendete a dimenticare su quale macchina state lavorando e a cancellare file sbagliati, troverete questa un ottima maniera per ricordare su che macchina vi trovate.

2.4 Il Primo Passo

L'aspetto del prompt viene controllato dalla variabile della shell PS1. Le continuazioni di un comando sono indicate dalla stringa PS2, che può essere modificata con esattamente gli stessi metodi qui discussi - poiché controllarla è esattamente uguale e non è altrettanto "interessante", modificherò primcipalmente la stringa PS1. (Ci sono anche le stringhe PS3 e PS4. Queste non vengono mai viste dall'utente medio - si veda la pagina di manuale di Bash se si è interessati al loro scopo). Per modificare l'aspetto del prompt, dovete cambiare la variabile PS1. Per fare esperimenti, potete cambiare la stringa PS1 direttamente al prompt e vedere immediatamente i risultati (questo influenza solo la sessione corrente e i cambiamenti spariscono quando fate log-out). Se volete rendere permanente un cambiamento del prompt, modificate il file ~/.bashrc e aggiungete lì la nuova definizione di PS1. Se avete permessi di root, potete guardare in /etc/profile e modificare la linea "PS1=". Sappiate che in alcune distribuzioni (almeno la Redhat 5.1) /etc/bashrc resetta le stringhe PS1 e PS2.

Prima di cominciare, è importante ricordare che la stringa PS1 viene salvata nell'ambiente. Se la modificate alla linea di comando, il prompt cambierà di conseguenza. Prima di fare dei cambiamenti, potete salvare il prompt corrente in un'altra variabile d'ambiente:

[giles@nikola giles]$ SAVE=$PS1
[giles@nikola giles]$

Il prompt più semplice sarebbe un singolo carattere, come:

[giles@nikola giles]$ PS1=$
$ls
bin   mail
$

Questo dimostra il modo migliore per fare esperimenti con semplici prompt, digitarli alla linea di comando. Si noti che il testo digitato dall'utente appare immediatamente dopo il prompt: io preferisco usare

$PS1="$ "
$ ls
bin   mail
$ 

che inserisce uno spazio dopo il prompt, rendendolo più leggibile. Per ripristinare il prompt originale, semplicemente richiamate la variabile che avete salvato:

$ PS1=$SAVE
[giles@nikola giles]$

2.5 Sequenza di Escape dei Prompt Bash

Vi sono molte sequenze di escape offerte dalla shell Bash da inserire nel prompt. Dalla pagina di manuale di Bash 2.02:

Quando eseguita in modalità interattiva, bash mostra il prompt
primario quando è pronta per leggere un comando e il prompt
secondario PS2 quando è necessario ulteriore input per
completare il comando. Bash permette di personalizzare queste stringhe
di prompt inserendo vari caratteri di escape speciali che vengono
interpretati come segue:
       \a     il carattere ASCII beep (07)
       \d     la data nel formato "Giorno-della-settimana Mese Data"
              (e.g., "Tue May 26")
       \e     un carattere di escape ASCII (033)
       \h     l'hostname fino al primo `.'
       \H     l'hostname
       \n     il carattere "newline"
       \r     il carattere "carriage return"
       \s     il nome della shell, il nome base di $0
              (la parte che segue lo slash finale)
       \t     l'ora corrente nel formato 24-ore HH:MM:SS
       \T     l'ora corrente nel formato 12-ore HH:MM:SS
       \@     l'ora corrente nel formato 12-ore am/pm
       \u     lo username dell'utente corrente
       \v     la versione di bash (e.g., 2.00)
       \V     la release di bash, versione + patchlevel
              (e.g., 2.00.0)
       \w     la directory di lavoro corrente
       \W     il nome di base della directory di lavoro corrente
       \!     il numero cronologico (history number) di questo comando
       \#     il numero di questo comando
       \$     se l'UID effettivo è 0, un #, altrimenti un $
       \nnn   il carattere corrispondente al numero ottale nnn
       \\     un backslash
       \[     comuncia una sequenza di caratteri non stampabili, che
              potrebbero essere usati per inserire una sequenza di
              controllo del terminale nel prompt
       \]     termina la sequenza di caratteri non stampabili

Continuando da dove avevamo interrotto:

[giles@nikola giles]$ PS1="\u@\h \W> "
giles@nikola giles> ls
bin   mail
giles@nikola giles>

Questo è simile al prompt predefinito su molte distribuzioni Linux. Volevo un apparenza leggermente differente, così l'ho cambiato a:

giles@nikola giles> PS1="[\t][\u@\h:\w]\$ "
[21:52:01][giles@nikola:~]$ ls
bin   mail
[21:52:15][giles@nikola:~]$ 

2.6 Impostare Permanentemente le Stringhe PS?

Varie persone e distribuzioni impostano le loro stringhe PS? in posti diversi. I posti più comuni sono /etc/profile, /etc/bashrc, ~/.bash_profile e ~/.bashrc. Johan Kullstam ( johan19@idt.net) scrive:

La stringa PS1 dovrebbe essere impostata in
.bashrc. questo perchè le shell bash non interattive resettano
PS1. La pagina di manuale di bash dice come la presenza o l'assenza di
PS1 è un buon modo di sapere se ci si trova in una sessione
bash interattiva oppure non-interattiva (e.g. uno script).

Il modo in cui mi sono accorto di questo è che startx è
uno script bash. Questo significa che startx annullerà il
vostro prompt. Quando impostate PS1 in .profile (o .bash_profile),
fate login alla consolle, fate partire X con startx, il vostro PS1
viene annullato nel processo lasciandovi con il prompt predefinito.

Una soluzione è di lanciare xterm e rxvt con l'opzione -ls per
forzarli a leggere .profile. Ma ogni volta che viene invoca una shell 
mediante uno shell-script non interativo PS1 viene perduto. system(3)
usa sh -c che se sh è bash distruggerà 
PS1. Un modo migliore è mettere la definizione di PS1 in 
.bashrc . questo viene letto ogni volta bash parte ed è dove le
cose interattive - come PS1 - dovrebbero restare.

Quindi dovrebbe essere sottolineato che PS1=..blabla.. dovrebbe stare
in .bashrc e non in .profile.

Ho provato a duplicare il problema che spiega, e ne ho incontrato uno diverso: la mia variabile PROMPT_COMMAND (che verrà introdotta più tardi) è stata distrutta. Le mie conoscenze in quest'area sono un po' vaghe, così mi associo a quanto dice Johan.


Avanti Indietro Indice