Bash è la shell standard di GNU/Linux e di molti altri sistemi Unix. Bash (Bourne Again SHell) è compatibile con la shell Bourne (sh
) e incorpora alcune funzionalità della shell Korn (ksh
) e della shell C (csh
). 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: bash.info e bash(1). |
L'eseguibile della shell Bash è bash
, che si trova normalmente nella directory /bin/
.
bash [<opzioni>] [<file-script>] [<argomenti>] |
Si distinguono fondamentalmente due tipi di modalità di funzionamento della shell Bash: interattiva e non interattiva. Quando l'eseguibile bash
viene avviato con l'indicazione del nome di un file, questo tenta di eseguirlo come uno script (in tal caso non conta che il file abbia i permessi di esecuzione e nemmeno che contenga la 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).
La shell Bash è potenzialmente compatibile con diversi altri 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 41.1 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 invito a inserire dei comandi. L'eseguibile bash
può essere avviato eventualmente in modo esplicitamente interattivo utilizzando l'opzione
.
*1*
-
i
Quando la shell Bash funziona in modo interattivo, se necessario, crea la variabile di ambiente PS1
che serve a contenere l'invito, e il parametro $
contiene anche la lettera -
i
.
*2*
Una shell interattiva può a sua volta essere una «shell 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 -
), oppure è stata avviata utilizzando l'opzione -
bash
. In pratica è, o dovrebbe essere, quello che si ha di fronte quando è stata completata la procedura di accesso.
-
login
La shell Bash messa in funzione a seguito di un accesso, se non è stata specificata l'opzione
:
-
noprofile
tenta di leggere ed eseguire il contenuto di /etc/profile
;
tenta di leggere ed eseguire il contenuto di ~/.bash_profile
, se non ci riesce, tenta con ~/.bash_login
, e se anche questo file non è accessibile o non esiste, tenta ancora con il file ~/.profile
.
Al termine della sessione di lavoro:
se esiste, legge ed esegue il contenuto di ~/.bash_logout
.
Se non è stata specificata una delle opzioni
o -
norc
, sempre che esista, viene letto ed eseguito il contenuto di -
rcfile~/.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'avvio in questa modalità, la shell Bash controlla il contenuto della variabile di ambiente BASH_ENV
: se questa variabile 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 dalla shell prima di dello script. In situazioni normali questa variabile è vuota, oppure non esistente del tutto.
Se l'eseguibile della shell Bash viene avviato con il nome sh
(per esempio attraverso un collegamento simbolico), per quanto riguarda l'utilizzo dei file di configurazione si comporta come la shell Bourne, e per il resto il suo funzionamento è conforme alla shell POSIX.
Nel caso di shell di login, tenta di eseguire solo /etc/profile
e ~/.profile
, rispettivamente. L'opzione
può essere utilizzata per disabilitare la lettura di questi file di avvio.
-
noprofile
Se l'eseguibile bash
viene avviato in modalità POSIX, attraverso l'opzione
, allora la shell 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 -
posixENV
.
Tipo | All'avvio | Alla conclusione | |
bash | login | /etc/profile + {~/.bash_profile|~/.bash_login|~/.profile} | ~/.bash_logout |
bash | interattiva | ~/.bashrc | |
bash | non inter. | $BASH_ENV | |
sh | login | /etc/profile + ~/.profile | |
sh | interattiva | $ENV | |
sh | non inter. | -- | |
bash - posix | login | $ENV | |
bash - posix | interattiva | $ENV | |
bash - posix | non inter. | -- |
La shell Bash interpreta due tipi di opzioni: a singolo carattere e multicarattere. Le opzioni multicarattere devono precedere necessariamente quelle a singolo carattere.
|
Riguarda la modalità interattiva: non esegue il file di configurazione ~/.bashrc
. Quando si avvia l'eseguibile della shell Bash utilizzando il nome sh
per mantenere la compatibilità con la shell Bourne, questo file di configurazione non deve essere letto e questa opzione è sottintesa.
|
Riguarda la modalità interattiva di login: non esegue i file di inizializzazione /etc/profile
, ~/.bash_profile
, ~/.bash_login
o ~/.bashrc
.
|
Riguarda la modalità interattiva: non esegue il file di inizializzazione personalizzato ~/.bashrc
, ma quello indicato come argomento.
|
Visualizza il numero di versione.
|
Fa in modo che funzioni in qualità di shell di login.
|
Quando è avviata in modalità interattiva, non usa la libreria GNU readline
per gestire la riga di comando.
|
Fa in modo di adeguarsi il più possibile alle specifiche POSIX 1003.2.
|
Vengono eseguiti i comandi contenuti nella stringa. Eventuali argomenti successivi vengono passati ai parametri posizionali a partire da $0
.
|
Forza l'esecuzione in modalità interattiva.
|
La shell legge i comandi dallo standard input.
Se restano degli argomenti dopo le opzioni e non è stato usato
o -
c
, il primo di questi argomenti viene interpretato come il nome di un file di comandi di shell: uno script di shell. Se la shell viene avviata in questo modo, viene assegnato al parametro -
s$0
il nome di questo script e ai parametri posizionali ($1
, $2
, $3
, ecc.) il resto degli argomenti. La shell legge ed esegue i comandi di questo script e quindi termina l'esecuzione. Il valore restituito alla fine della sua esecuzione è quello dell'ultimo comando eseguito dallo script.
La shell 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 41.2 mostra un elenco delle funzionalità dei tasti e delle 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. |
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 inserite precedentemente. 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 e negli altri capitoli. Se si desidera approfondirle occorre consultare la documentazione originale, bash.info e bash(1), in corrispondenza di quanto descritto a proposito della libreria readline
.
Quando la shell funziona in modo interattivo, può mostrare due tipi di invito:
quello primario definito nella variabile PS1
quando è pronta a ricevere un comando;
quello secondario definito nella variabile PS2
quando necessita di maggiori dati per completare un comando.
Il contenuto di queste variabili è una stringa che può essere composta da alcuni simboli speciali contrassegnati dal carattere di escape (\
), che acquistano il significato indicato nella tabella
41.3.
Codice | Descrizione |
\t | Orario attuale nel formato hh:mm:ss (ore, minuti, secondi). |
\d | Data attuale. |
\n | Interruzione di riga. |
\s | Nome della shell. |
\w | Directory corrente. |
\W | Percorso precedente alla directory corrente (basename). |
\u | Utente. |
\h | Nome del nodo. |
\# | Numero del comando attuale. |
\! | Numero del comando nello storico. |
\$ | # se UID = 0; $ se UID > 0. |
\nnn | Carattere corrispondente al numero ottale indicato. |
\\ | Una barra obliqua inversa singola (\ ). |
\[ | Inizio di una sequenza di controllo. |
\] | Fine di una sequenza di controllo. |
In particolare merita attenzione \$
, il cui significato potrebbe non essere chiaro dalla descrizione fatta nella tabella. 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 $
.
La stringa dell'invito, 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, dell'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 invito che visualizza il nome dell'utente, il nome dell'elaboratore, la directory corrente e il simbolo $
o #
a seconda del tipo di utente.
daniele@dinkel:~$ |
La conclusione del funzionamento della shell, 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.
1.) Questa opzione potrebbe sembrare superflua, ma ci sono circostanze in cui è davvero importante poter indicare esplicitamente ciò che si vuole.
2.) Se le variabile e i parametri sono ancora concetti oscuri, questi dovrebbero essere chiariti nei capitoli successivi.