3.2 Comandi della shell
Un semplice comando di shell come echo a b c
consiste nel comando stesso seguito da argomenti, separati da spazi.
I comandi della shell più complessi sono composti da semplici comandi disposti insieme in vari modi: in una pipeline in cui l’output di un comando diventa l’input di un secondo, in un ciclo o in un costrutto condizionale o in qualche altro raggruppamento.
• Parole riservate | Parole che hanno un significato speciale per la shell. | |
• Comandi semplici | Il tipo più comune di comando. | |
• Condutture | Collegamento dell’ingresso e dell’uscita di più comandi. | |
• Elenchi | Come eseguire i comandi in sequenza. | |
• Comandi composti | Comandi della shell per il flusso di controllo. | |
• Coprocessi | Comunicazione bidirezionale tra comandi. | |
• Parallelo GNU | Esecuzione di comandi in parallelo. |
3.2.1 Parole riservate
Le parole riservate sono parole che hanno un significato speciale per la shell. Sono usati per iniziare e terminare i comandi composti della shell.
Le seguenti parole sono riconosciute come riservate se non tra virgolette e la prima parola di un comando (vedi sotto per le eccezioni):
if | then | elif | else | fi | time |
for | in | until | while | do | done |
case | esac | coproc | select | function | |
{ | } | [[ | ]] | ! |
in
viene riconosciuta come una parola riservata se è la terza parola di un comando case
o . e sono riconosciute come parole riservate se sono la terza parola in un comando. select
in
do
for
3.2.2 Comandi semplici
Un comando semplice è il tipo di comando che si incontra più spesso. È solo una sequenza di parole separate da blank
s, terminata da uno degli operatori di controllo della shell (vedi Definitions ). La prima parola generalmente specifica un comando da eseguire, mentre il resto delle parole sono gli argomenti di quel comando.
Lo stato di ritorno (vedi Exit Status ) di un comando semplice è il suo stato di uscita come previsto dalla funzione POSIX 1003.1 waitpid
, oppure 128+ n se il comando è stato terminato dal segnale n .
3.2.3 Pipelines ( Condutture )
A pipeline
è una sequenza di uno o più comandi separati da uno degli operatori di controllo ‘|‘ o ‘|&‘.
Il formato per una pipeline è
[tempo [-p]] [!] comando1 [ | o |& comando2 ] …
L’output di ogni comando nella pipeline è collegato tramite una pipe all’input del comando successivo. Cioè, ogni comando legge l’output del comando precedente. Questa connessione viene eseguita prima di qualsiasi reindirizzamento specificato dal comando.
Se ‘|&‘ viene utilizzato, l’errore standard di comando1 , oltre al suo output standard, è collegato allo standard input di comando2 tramite la pipe; è l’abbreviazione di 2>&1 |
. Questo reindirizzamento implicito dell’errore standard allo standard output viene eseguito dopo qualsiasi reindirizzamento specificato dal comando.
La parola riservata time
fa sì che le statistiche di temporizzazione vengano stampate per la pipeline una volta terminata. Le statistiche attualmente sono costituite dal tempo trascorso (orologio da parete) e dal tempo utente e di sistema consumato dall’esecuzione del comando. Il-Pl’opzione cambia il formato di output in quello specificato da POSIX . Quando la shell è in modalità POSIX (vedi Bash POSIX Mode ), non riconosce time
come parola riservata se il token successivo inizia con un ‘–‘. La TIMEFORMAT
variabile può essere impostata su una stringa di formato che specifica come devono essere visualizzate le informazioni di temporizzazione. Vedere Variabili Bash per una descrizione dei formati disponibili. L’uso di time
come parola riservata consente la temporizzazione di incorporamenti di shell, funzioni di shell e pipeline. Un comando esterno time
non può cronometrarli facilmente.
Quando la shell è in modalità POSIX (vedi Bash POSIX Mode ), time
può essere seguita da una nuova riga. In questo caso, la shell visualizza il tempo totale dell’utente e del sistema utilizzato dalla shell e dai suoi figli. La TIMEFORMAT
variabile può essere utilizzata per specificare il formato delle informazioni sull’ora.
Se la pipeline non viene eseguita in modo asincrono (vedi Lists ), la shell attende il completamento di tutti i comandi nella pipeline.
Ogni comando in una pipeline viene eseguito nella propria subshell, che è un processo separato (vedi Command Execution Environment ). Se l’ lastpipe
opzione è abilitata utilizzando il shopt
builtin (vedi The Shopt Builtin ), l’ultimo elemento di una pipeline può essere eseguito dal processo della shell.
Lo stato di uscita di una pipeline è lo stato di uscita dell’ultimo comando nella pipeline, a meno che l’ pipefail
opzione non sia abilitata (vedere The Set Builtin ). Se pipefail
è abilitato, lo stato di ritorno della pipeline è il valore dell’ultimo comando (più a destra) per uscire con uno stato diverso da zero o zero se tutti i comandi sono terminati correttamente. Se la parola riservata ‘!‘ precede la pipeline, lo stato di uscita è la logica negazione dello stato di uscita come descritto sopra. La shell attende che tutti i comandi nella pipeline vengano terminati prima di restituire un valore.
3.2.4 Elenchi di comandi
A list
è una sequenza di una o più condotte separate da uno degli operatori;‘, ‘&‘, ‘&&‘, o ‘||‘, e facoltativamente terminato da uno di ‘;‘, ‘&‘, o un newline
.
Di questi operatori di elenco, ‘&&‘ e ‘||‘ hanno uguale precedenza, seguito da ‘;‘ e ‘&‘, che hanno uguale precedenza.
Una sequenza di una o più nuove righe può apparire in a list
per delimitare i comandi, equivalente a un punto e virgola.
Se un comando viene terminato dall’operatore di controllo ‘&‘, la shell esegue il comando in modo asincrono in una subshell. Questo è noto come esecuzione del comando in background e questi sono indicati come comandi asincroni . La shell non attende il completamento del comando e lo stato di ritorno è 0 (true). Quando il controllo dei lavori non è attivo (vedi Controllo dei lavori ), l’input standard per i comandi asincroni, in assenza di reindirizzamenti espliciti, viene reindirizzato da /dev/null
.
Comandi separati da un ‘;‘ vengono eseguiti in sequenza; la shell attende che ogni comando termini a turno. Lo stato di ritorno è lo stato di uscita dell’ultimo comando eseguito.
Gli elenchi AND e OR sono sequenze di una o più pipeline separate dagli operatori di controllo ‘&&‘ e ‘||‘, rispettivamente. Gli elenchi AND e OR vengono eseguiti con associatività a sinistra.
Un elenco AND ha la forma
comando1 && comando2
comando2 viene eseguito se, e solo se, comando1 restituisce uno stato di uscita pari a zero (successo).
Un elenco OR ha il modulo
comando1 || comando2
comando2 viene eseguito se, e solo se, comando1 restituisce uno stato di uscita diverso da zero.
Lo stato di ritorno degli elenchi AND e OR è lo stato di uscita dell’ultimo comando eseguito nell’elenco.
3.2.5 Comandi composti
• Costrutti in loop | Comandi della shell per l’azione iterativa. | |
• Costrutti condizionali | Comandi della shell per l’esecuzione condizionale. | |
• Raggruppamento dei comandi | Modi per raggruppare i comandi. |
I comandi composti sono i costrutti del linguaggio di programmazione della shell. Ogni costrutto inizia con una parola riservata o un operatore di controllo e termina con una parola o un operatore riservato corrispondente. Eventuali reindirizzamenti (consulta Reindirizzamenti ) associati a un comando composto si applicano a tutti i comandi all’interno di tale comando composto, a meno che non siano esplicitamente sostituiti.
Nella maggior parte dei casi un elenco di comandi nella descrizione di un comando composto può essere separato dal resto del comando da una o più nuove righe e può essere seguito da una nuova riga al posto di un punto e virgola.
Bash fornisce costrutti di loop, comandi condizionali e meccanismi per raggruppare i comandi ed eseguirli come un’unità.