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).
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.
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.
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:
A meno che non sia stata specificata una delle opzioni -
-
norc o
-
-
rcfile, sempre che esista, viene letto ed eseguito il contenuto di
~/.bashrc.
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.
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.
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.
bash interpreta due tipi di opzioni: a singolo carattere e multicarattere. Le opzioni multicarattere devono necessariamente precedere quelle a singolo carattere.
-
-
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.
-
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.
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.
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.
Generalmente funzionano anche i tasti freccia per spostare il cursore.
In particolare, i tasti
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.
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.
\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 (
\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.
$
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:~$
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.