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.

#!/bin/bash

echo "doing stuff..."

exit
~/script.sh

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.