Capitolo successivo Capitolo precedente Indice

23. Bash - avvio e conclusione

bash è la shell standard di Linux e di molti altri sistemi Unix. bash (Bourne Again SHell) è compatibile con sh (Bourne Shell) e incorpora alcune funzionalità di ksh (Korn Shell) e csh (C Shell). bash è progettata per essere aderente alle specifiche POSIX.2.

<!>   bash è una shell molto complessa e tutte le notizie contenute in questo documento non sono sufficienti a completarne il quadro. Se necessario si deve consultare la documentazione originale: info bash e bash(1).

23.1 Avvio di bash

bash [<opzioni>] [<file-script>] [<argomenti>]

Si distinguono fondamentalmente due tipi di modalità di funzionamento di bash: interattiva e non interattiva. Quando viene avviata con l'indicazione del nome di un file, la shell bash tenta di eseguirlo come uno script (in tal caso non conta che il file sia eseguibile e nemmeno che contenga al dichiarazione iniziale #!/bin/bash). Gli eventuali argomenti che possono seguire il nome del file, vengono passati allo script in forma di parametri (come viene descritto più avanti).

bash è potenzialmente compatibile con diversi tipi di shell e questo crea una sostanziale differenza di comportamento nel momento dell'avvio, a seconda del tipo di compatibilità a cui ci si riferisce.

La tabella (tabella) mostra in particolare, la sequenza di file di configurazione utilizzati a seconda del tipo di emulazione preferito.

Shell interattiva

La shell è interattiva quando interagisce con l'utente, e di conseguenza mostra un prompt. bash può eventualmente essere avviata in modo esplicitamente interattivo utilizzando l'opzione -i.

Questa opzione potrebbe sembrare superflua, ma ci sono circostanze in cui è davvero importante poter indicare esplicitamente ciò che si vuole.

Quando bash funziona in modo interattivo, se necessario, crea la variabile di ambiente PS1 che serve a contenere il prompt, e il parametro $- contiene anche la lettera i.

Se le variabile e i parametri sono ancora concetti oscuri, questi dovrebbero essere chiariti nei capitoli successivi.

Una shell interattiva può a sua volta essere di login o meno. La distinzione serve alla shell per determinare quali file di configurazione utilizzare.

Shell interattiva di login

Una shell di login è quella in cui il parametro zero, ovvero $0, contiene un trattino (-) come primo carattere (di solito contiene esattamente il valore -bash), oppure è stata avviata utilizzando l'opzione --login. In pratica è, o dovrebbe essere, quello che si ha di fronte quando è stata completata la procedura di login.

bash, nel momento dell'avvenuto login, a meno che non sia stata specificata l'opzione --noprofile:

Al termine dell'esecuzione:

Shell interattiva normale

A meno che non sia stata specificata una delle opzioni --norc o --rcfile, sempre che esista, viene letto ed eseguito il contenuto di ~/.bashrc.

Collegamenti tra file di configurazione

Spesso si include l'esecuzione del contenuto del file ~/.bashrc anche nel caso di shell di login e questo attraverso un accorgimento molto semplice: all'interno del file ~/.bash_profile si includono le righe seguenti.

...
if [ -f ~/.bashrc ]
then
    source ~/.bashrc
fi
...

Il significato è semplice: viene controllata l'esistenza del file ~/.bashrc e se viene trovato viene caricato ed eseguito.

Shell non interattiva

Una shell non interattiva è di norma dedicata a eseguire uno script. Nel momento dell'avviamento in questa modalità, bash controlla il contenuto della variabile di ambiente BASH_ENV e se e non è vuota, esegue il file nominato al suo interno.

In pratica, attraverso questa variabile si indica un file di configurazione che si vuole sia eseguito da bash prima di eseguire lo script. In situazioni normali questa variabile è solitamente vuota, o inesistente.

Compatibilità con sh e POSIX

Se bash viene avviata come sh (per esempio attraverso un link simbolico), si comporta come la shell Bourne per quanto riguarda l'utilizzo dei file di configurazione e poi il suo funzionamento è conforme alla shell POSIX.

Nel caso di shell di login, tenta di eseguire solo /etc/profile e ~/.profile, rispettivamente. L'opzione --noprofile può essere utilizzata per disabilitare la lettura di questi file di avvio.

Se bash viene avviata in modalità POSIX, attraverso l'opzione --posix, segue lo standard POSIX per i file di avvio. In tal caso, per una shell non interattiva, viene utilizzato il nome del file contenuto nella variabile ENV.


Tipo All'avvio Alla conclusione
bash login /etc/profile + {~/.bash_profile|~/.bash_login|~/.profile} ~/.bash_logout
bash interattiva ~/.bashrc
bash non interattiva $BASH_ENV
sh login /etc/profile + ~/.profile
sh interattiva $ENV
sh non interattiva --
bash --posix login $ENV
bash --posix interattiva $ENV
bash --posix non interattiva --
A seconda del modo con cui bash viene avviata si utilizzano diversi tipi di file di configurazione.

23.2 Opzioni

bash interpreta due tipi di opzioni: a singolo carattere e multicarattere. Le opzioni multicarattere devono necessariamente precedere quelle a singolo carattere.

Alcune opzioni multicarattere

--norc

Riguarda la modalità interattiva: non esegue il file di configurazione ~/.bashrc. Quando si avvia bash utilizzando il nome sh per mantenere la compatibilità con la shell Bourne, questo file di configurazione non deve essere letto, quindi in questo caso, quest'opzione è predefinita.

--noprofile

Riguarda la modalità interattiva di login: non esegue i file di inizializzazione /etc/profile, ~/.bash_profile, ~/.bash_login o ~/.bashrc.

--rcfile <file>

Riguarda la modalità interattiva: non esegue il file di inizializzazione personalizzato ~/.bashrc, ma quello indicato come argomento.

--version

Visualizza il numero di versione.

--login

Fa in modo che bash funzioni come se fosse stata avviata come shell di login.

-noediting

Quando è avviata in modalità interattiva, non usa la libreria GNU readline per leggere le linee di comando.

--posix

Fa in modo che bash si adegui il più possibile alle specifiche POSIX 1003.2.

Alcune opzioni a singolo carattere

-c <stringa>

Vengono eseguiti i comandi contenuti nella stringa. Eventuali argomenti successivi, vengono passati ai parametri posizionali a partire da $0.

-i

Forza l'esecuzione in modalità interattiva.

-s

La shell legge i comandi dallo standard input.

23.3 Interpretazione degli argomenti successivi

Se restano degli argomenti dopo le opzioni, e non sono state usate le opzioni -c o -s, il primo degli argomenti viene interpretato come nome di un file di comandi di shell: uno script di shell. Se bash viene avviata in questo modo, viene assegnato al parametro $0 il nome di questo script e ai parametri posizionali ( $1, $2, $3, ... ) il resto degli argomenti. bash legge ed esegue i comandi di questo script e quindi termina l'esecuzione. Il valore restituito da bash alla fine della sua esecuzione è quello dell'ultimo comando eseguito dallo script.

23.4 Uso sommario della tastiera

bash fornisce un sistema di gestione della tastiera molto complesso, attraverso un gran numero di funzioni. Teoricamente è possibile ridefinire ogni tasto speciale e ogni combinazione di tasti a seconda delle proprie preferenze. In pratica, non è consigliabile un approccio di questo tipo, dal momento che tutto questo serve solo per gestire la riga di comando.

La tabella (seguente) mostra un elenco delle funzionalità dei tasti e combinazioni più importanti.


Comando Descrizione
Caratteri normali Inseriscono semplicemente i caratteri corrispondenti.
Ctrl+b Sposta il cursore all'indietro di una posizione.
Ctrl+f Sposta il cursore in avanti di una posizione.
Backspace Cancella il carattere alla sinistra del cursore.
Ctrl+d Cancella il carattere corrispondente alla posizione del cursore.
Ctrl+a Sposta il cursore all'inizio della riga.
Ctrl+e Sposta il cursore alla fine della riga.
Alt+f Sposta il cursore in avanti di una parola.
Alt+b Sposta il cursore all'indietro di una parola.
Ctrl+l Ripulisce lo schermo.
Elenco delle funzionalità dei tasti e delle combinazioni più importanti di bash.

Generalmente funzionano anche i tasti freccia per spostare il cursore. In particolare, i tasti [freccia su] e [freccia giù] permettono di richiamare le righe di comando precedentemente inserite. Quando si preme un tasto o una combinazione non riconosciuta, si ottiene una segnalazione di errore.

Le funzionalità avanzate di gestione e programmazione della tastiera non sono descritte in questo capitolo. Se si desidera approfondirle occorre consultare la documentazione originale, info bash e bash(1), in corrispondenza della libreria readline.

23.5 Invito o prompt

Quando bash funziona in modo interattivo, può mostrare due tipi di prompt:

Il contenuto di queste variabili è una stringa che può contenere alcuni caratteri speciali contrassegnati dal carattere di escape (\), che acquistano il significato indicato qui di seguito.

Codici speciali per il prompt

\t

Rappresenta l'orario attuale nel formato hh:mm:ss (ore, minuti, secondi).

\d

Rappresenta la data nel formato: ``settimana mese giorno'' (per esempio: Tue Apr 15).

\n

Rappresenta il carattere newline (<LF>).

\s

Corrisponde al nome della shell.

\w

Corrisponde alla directory corrente.

\W

Corrisponde al nome base (basename) della directory corrente.

\u

Corrisponde al nome dell'utente.

\h

Corrisponde al nome del computer (host).

\#

Corrisponde al numero del comando attuale.

\!

Corrisponde al numero del comando nello storico.

\$

Rappresenta un simbolo che cambia in funzione del livello di importanza dell'utente: Se si tratta di un UID pari a 0 (se cioè si tratta dell'utente root) corrisponde al simbolo #, negli altri casi corrisponde al simbolo $.

\nnn

Rappresenta un carattere corrispondente al numero ottale fornito dopo la barra.

\\

Rappresenta una barra inclinata rovescia, \.

\[

Rappresenta l'inizio di una serie di caratteri non stampabili. Questo metodo di delimitazione viene utilizzato per incorporare una sequenza di controllo per il terminale.

\]

Rappresenta la fine di una una serie di caratteri non stampabili.

La stringa del prompt, dopo la decodifica dei codici di escape appena visti, viene eventualmente espansa attraverso i processi di sostituzione dei parametri e delle variabili, della sostituzione dei comandi, della espressione aritmetica e della suddivisione delle parole. Il concetto di espansione e sostituzione viene descritto del prossimo capitolo.

Esempi

$ PS1='\u@\h:\w\$ '

Questo esempio fa in modo di ottenere un prompt che visualizza il nome dell'utente, il nome del computer, la directory corrente e il simbolo $ o # a seconda del tipo di utente.

daniele@topolino:~$

23.6 Conclusione

La conclusione del funzionamento di bash quando si trova in modalità interattiva, si ottiene normalmente attraverso il comando interno exit, oppure eventualmente con il comando interno logout, se si tratta di una shell di login. Se invece si tratta di una shell avviata per interpretare uno script, questa termina silenziosamente alla conclusione dello script stesso.


Capitolo successivo Capitolo precedente Indice