[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]

41. Bash: avvio e conclusione

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).

41.1 Avvio di Bash

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.

41.1.1 Shell interattiva

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 -i. *1*

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.

41.1.1.1 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 accesso.

La shell Bash messa in funzione a seguito di un accesso, se non è stata specificata l'opzione -noprofile:

Al termine della sessione di lavoro:

41.1.1.2 Shell interattiva normale

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

41.1.1.3 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.

41.1.2 Shell non interattiva

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.

41.1.3 Compatibilità con sh e POSIX

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 -noprofile può essere utilizzata per disabilitare la lettura di questi file di avvio.

Se l'eseguibile bash viene avviato in modalità POSIX, attraverso l'opzione -posix, 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 ENV.

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. --

Tabella 41.1: A seconda del modo con cui l'eseguibile della shell Bash viene avviato si utilizzano diversi tipi di file di configurazione.

41.2 Opzioni

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

Alcune opzioni multicarattere

-norc

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.

-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 funzioni in qualità di shell di login.

-noediting

Quando è avviata in modalità interattiva, non usa la libreria GNU readline per gestire la riga di comando.

-posix

Fa in modo di adeguarsi 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.

41.3 Interpretazione degli argomenti successivi

Se restano degli argomenti dopo le opzioni e non è stato usato -c o -s, 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 $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.

41.4 Uso sommario della tastiera

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.

Tabella 41.2: Elenco delle funzionalità dei tasti e delle combinazioni più importanti.

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.

41.5 Invito o prompt

Quando la shell funziona in modo interattivo, può mostrare due tipi di invito:

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.

Tabella 41.3: Elenco dei codici speciali per definire l'invito.

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.

Esempi

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:~$

41.6 Conclusione

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.


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]