Spesso quando si scrivono script Bash, sarà necessario terminare lo script quando viene soddisfatta una determinata condizione o intraprendere un'azione in base al codice di uscita di un comando.
In questo articolo tratteremo l'exit
di Bash comando integrato e gli stati di uscita dei comandi eseguiti.
Stato uscita #
Ogni comando della shell restituisce un codice di uscita quando termina, con o senza successo.
Per convenzione, un codice di uscita pari a zero indica che il comando è stato completato correttamente e un codice 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 $?
La date
comando completato con successo e il codice di uscita è zero:
0
Se provi a eseguire ls
su una directory non esistente 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 multicomando, lo stato di uscita della pipeline è quello dell'ultimo comando:
sudo tcpdump -n -l | tee file.out
echo $?
Nell'esempio sopra echo $?
stamperà il codice di uscita del tee
comando.
Bash exit
comando #
L'exit
comando esce dalla shell con uno stato di N
. Ha la seguente sintassi:
exit N
Se N
non viene fornito, il codice dello stato di uscita è quello dell'ultimo comando eseguito.
Quando viene utilizzato negli script di shell, il valore fornito come argomento a exit
il comando viene restituito alla shell come codice di uscita.
Esempi #
Lo stato di uscita dei comandi può essere utilizzato in comandi condizionali come if
. Nell'esempio seguente grep
uscirà con zero (che significa vero negli script di shell) se la "stringa di ricerca" viene trovata 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, la mkdir
il comando 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.
#!/bin/bash
echo "doing stuff..."
exit
Usando solo exit
è uguale a exit $?
o omettendo 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 esegui lo script come root, il codice di uscita sarà zero. In caso contrario, lo script uscirà con lo stato 1
.
Conclusione #
Ogni comando della shell restituisce un codice di uscita quando termina. L'exit
comando viene utilizzato per uscire da una shell con un determinato stato.
Se hai domande o feedback, sentiti libero di lasciare un commento.