Sì; puoi usare return
invece di exit
. Il suo scopo principale è tornare da una funzione di shell, ma se la usi all'interno di un source
-d script, ritorna da quello script.
Come §4.1 "Bourne Shell Builtins" del Manuale di riferimento di Bash dice:
return [n]
Fa terminare una funzione di shell con il valore restituito n .Se n non viene fornito, il valore restituito è lo stato di uscita dell'ultimo comando eseguito nella funzione. Questo può essere utilizzato anche per terminare l'esecuzione di uno script in esecuzione con il
.
(osource
) incorporato, restituendo n o lo stato di uscita dell'ultimo comando eseguito all'interno dello script come stato di uscita dello script.Qualsiasi comando associato alRETURN
trap viene eseguito prima che l'esecuzione riprenda dopo la funzione o lo script. Lo stato restituito è diverso da zero sereturn
è usato al di fuori di una funzione e non durante l'esecuzione di uno script da parte di.
osource
.
Invece di eseguire lo script usando . run2.sh
, puoi eseguirlo utilizzando sh run2.sh
o bash run2.sh
Verrà avviata una nuova sub-shell, per eseguire lo script poi, verrà chiusa alla fine dello script lasciando aperta l'altra shell.
Il "problema" in realtà è che stai procurando e non eseguendo lo script. Quando crei un file, il suo contenuto verrà eseguito nella shell corrente, invece di generare una subshell. Quindi tutto, inclusa l'uscita, influenzerà la shell corrente.
Invece di usare exit
, ti consigliamo di utilizzare return
.
Puoi aggiungere un comando di uscita aggiuntivo dopo l'istruzione/comando return in modo che funzioni per entrambi, eseguendo lo script dalla riga di comando e recuperando dal terminale.
Esempio di codice di uscita nello script:
if [ $# -lt 2 ]; then
echo "Needs at least two arguments"
return 1 2>/dev/null
exit 1
fi
La riga con exit
il comando non verrà chiamato quando si genera lo script dopo il return
comando.
Quando esegui lo script, return
comando dà un errore. Quindi, eliminiamo il messaggio di errore inoltrandolo a /dev/null
.