Capitolo 6. Exit ed exit status

 

...there are dark corners in the Bourne shell, and people use all of them.

 Chet Ramey

Il comando exit può essere usato per terminare uno script, proprio come in un programma in linguaggio C. Può anche restituire un valore disponibile al processo genitore dello script.

Ogni comando restituisce un exit status (talvolta chiamato anche return status ). Un comando che ha avuto successo restituisce 0, mentre, in caso di insuccesso, viene restituito un valore diverso da zero, che solitamente può essere interpretato come un codice d'errore. Comandi, programmi e utility UNIX correttamente eseguiti restituiscono come codice di uscita 0, con significato di successo, sebbene ci possano essere delle eccezioni.

In maniera analoga, sia le funzioni all'interno di uno script che lo script stesso, restituiscono un exit status che nient'altro è se non l'exit status dell'ultimo comando eseguito dalla funzione o dallo script. In uno script, il comando exit nnn può essere utilizzato per inviare l'exit status nnn alla shell (nnn deve essere un numero decimale compreso nell'intervallo 0 - 255).

Nota

Quando uno script termina con exit senza alcun parametro, l'exit status dello script è quello dell'ultimo comando eseguito (quello che precede exit).

#!/bin/bash

COMANDO_1

. . .

# Esce con lo status dell'ultimo comando.
ULTIMO_COMANDO

exit

L'equivalente del solo exit è exit $? o, addirittura, tralasciando semplicemente exit.

#!/bin/bash

COMANDO_1

. . .

# Esce con lo status dell'ultimo comando.
ULTIMO_COMANDO

exit $?

#!/bin/bash

COMANDO1

. . .

# Esce con lo status dell'ultimo comando.
ULTIMO_COMANDO

$? legge l'exit status dell'ultimo comando eseguito. Dopo l'esecuzione di una funzione, $? fornisce l'exit status dell'ultimo comando eseguito nella funzione. Questo è il modo che Bash ha per consentire alle funzioni di restituire un "valore di ritorno". Al termine di uno script, digitando $? da riga di comando, si ottiene l'exit status dello script, cioè, dell'ultimo comando eseguito che, per convenzione, è 0 in caso di successo o un intero compreso tra 1 e 255 in caso di errore.

Esempio 6-1. exit / exit status

#!/bin/bash

echo ciao
echo $?    # Exit status 0 perché il comando è stato eseguito con successo.

lskdf      #  Comando sconosciuto.
echo $?    #  Exit status diverso da zero perché il comando non ha 
           #+ avuto successo.

echo

exit 113   # Restituirà 113 alla shell.
           # Per verificarlo, digitate "echo $?" dopo l'esecuzione dello script.

#  Convenzionalmente, un 'exit 0' indica successo,
#+ mentre un valore diverso significa errore o condizione anomala.

$? è particolarmente utile per la verifica del risultato di un comando in uno script (vedi Esempio 15-32 e Esempio 15-17).

Nota

Il !, l'operatore logico "not", inverte il risultato di una verifica o di un comando e questo si ripercuote sul relativo exit status.

Esempio 6-2. Negare una condizione utilizzando !

true  # il builtin "true".
echo "exit status di \"true\" = $?"     # 0

! true
echo "exit status di \"! true\" = $?"   # 1
# Notate che "!" deve essere seguito da uno spazio.
# !true restituisce l'errore  "command not found"
#
#  L'operatore '!' anteposto ad un comando richiama la cronologia dei
#+ comandi di Bash.

true
!true
# Questa volta nessun errore, ma neanche nessuna negazione.
# Viene ripetuto semplicemente il comando precedente (true).

# Grazie a Stéphane Chazelas e Kristopher Newsome.

Attenzione

Alcuni codici di exit status hanno significati riservati e non dovrebbero quindi essere usati dall'utente in uno script.