[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]
Bash (1) è la shell standard dei sistemi GNU 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.
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, creando una differenza sostanziale di comportamento nel momento dell'avvio, a seconda del tipo di compatibilità a cui ci si riferisce.
La tabella 60.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 -i.(2)
Quando la shell Bash funziona in modo interattivo, se necessario, crea la variabile di ambiente PS1 che serve a contenere l'invito, mentre il parametro $- contiene anche la lettera i.(3)
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 -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:
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 -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, 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 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, mentre 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.
Tabella 60.1. A seconda del modo con cui l'eseguibile della shell Bash viene avviato si utilizzano diversi tipi di file di configurazione.
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 carattere singolo e multicarattere. Le opzioni multicarattere devono precedere necessariamente quelle a carattere singolo.
-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.
-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
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.
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 del genere, dal momento che tutto questo serve solo per gestire la riga di comando.
La tabella 60.2 mostra un elenco delle funzionalità dei tasti e delle combinazioni più importanti.
Tabella 60.2. 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 60.3.
Tabella 60.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 zero (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 alla conclusione dello script stesso, senza bisogno di intervenire.
2) Questa opzione potrebbe sembrare superflua, ma ci sono circostanze in cui è davvero importante poter indicare esplicitamente ciò che si vuole.
3) Se le variabile e i parametri sono ancora concetti oscuri, questi dovrebbero essere chiariti nei capitoli successivi.
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome bash_avvio_e_conclusione.html
[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]