Introduzione
Spesso quando si scrivono script Bash, è necessario terminare lo script quando viene soddisfatta una determinata condizione o intraprendere azioni in base al codice di uscita di un comando.
In questo articolo, tratteremo il comando exit
integrato di Bash e gli stati di uscita dei comandi eseguiti.
Stato di uscita
Ogni comando shell restituisce un codice di uscita quando termina, con esito positivo o negativo.
Per convenzione, un codice di uscita pari a zero indica che il comando è stato completato correttamente e che un valore diverso da zero indica che si è verificato un errore.
La variabile speciale $?
restituisce lo stato di uscita dell'ultimo comando eseguito:
date &> /dev/null
echo $?
Il comando date
è stato completato correttamente e il codice di uscita è zero:
0
Se si tenta di eseguire ls
su una directory inesistente, il codice di uscita sarà diverso da zero:
ls /nonexisting_dir &> /dev/null
echo $?
2
Il codice di stato può essere utilizzato per scoprire perché il comando non è riuscito. La pagina man di ogni comando include informazioni sui codici di uscita.
Quando si esegue una pipeline multi-comando, lo stato di uscita della pipeline è quello dell'ultimo comando:
sudo tcpdump -n -l | tee file.out
echo $?
Nell'esempio sopra echo $?
stampa il codice di uscita del comando tee
.
Comando exit in Bash
Il comando exit
esce dalla shell con uno stato di N
. Ha la seguente sintassi:
exit N
Se N
non viene specificato, il codice dello stato di uscita è quello dell'ultimo comando eseguito.
Se utilizzato negli script di shell, il valore fornito come argomento al comando exit
viene restituito alla shell come codice di uscita.
Esempi
Lo stato di uscita dei comandi può essere utilizzato in comandi condizionali come if
. Nel seguente esempio grep
uscirà con zero (che significa vero negli script di shell) se la "stringa di ricerca" si trova in filename
:
if grep -q "search-string" filename then
echo "String found."
else
echo "String not found."
fi
Quando si esegue un elenco di comandi separati da &&
(AND) o ||
(OR), lo stato di uscita del comando determina se verrà eseguito il comando successivo nell'elenco. Qui, il comando mkdir
verrà eseguito solo se cd
restituisce zero:
cd /opt/code && mkdir project
Se uno script termina con exit
senza specificare un parametro, il codice di uscita dello script è quello dell'ultimo comando eseguito nello script.
Usare solo exit
è lo stesso di exit $?
.
Ecco un esempio che mostra come terminare lo script se invocato da un utente non root:
#!/bin/bash
if [[ "$(whoami)" != root ]]; then
echo "Only user root can run this script."
exit 1
fi
echo "doing stuff..."
exit 0
Se si esegue lo script come root, il codice di uscita sarà zero. Altrimenti, lo script uscirà con lo stato 1
.
Conclusione
Ogni comando shell restituisce un codice di uscita al termine. Il comando exit
viene utilizzato per uscire da una shell con un determinato stato.