Sì, il valore di ritorno implicito di una funzione è lo stato di uscita dell'ultimo comando eseguito . Questo è anche vero in qualsiasi punto di qualsiasi script di shell. In qualsiasi punto della sequenza di esecuzione dello script, lo stato di uscita attuale è lo stato di uscita dell'ultimo comando eseguito. Anche comando eseguito come parte di un'assegnazione di variabile: var=$(exit 34)
. La differenza con le funzioni è che una funzione potrebbe cambiare lo stato di uscita al termine dell'esecuzione della funzione.
Il modo alternativo di modificare lo "stato di uscita attuale" è quello di avviare una shell secondaria ed uscire con lo stato di uscita necessario:
$ $(exit 34)
$ echo "$?"
34
E sì, l' espansione dello stato di uscita deve essere quotata:
$ IFS='123'
$ $(exit 34)
$ echo $?
4
Un (exit 34)
lavoro anche.
Alcuni potrebbero obiettare che dovrebbe essere un costrutto più robusto $(return 34)
e che un'uscita dovrebbe "uscire" dallo script in esecuzione. Ma $(return 34)
non funziona con nessuna versione di bash. Quindi, non è portatile.
Il modo più sicuro per impostare uno stato di uscita è usarlo come è stato progettato per funzionare, definire e return
da una funzione:
exitstatus(){ return "${1:-"$?"}"; }
Quindi, alla fine di una funzione. è esattamente equivalente a non avere nulla o return
oppure return "$?"
. La fine di una funzione non deve necessariamente significare "l'ultima riga di codice di una funzione".
#!/bin/sh
exitstatus(){ a="${1:-"$?"}"; return "$a"; }
gmx(){
if [ "$1" = "one" ]; then
printf 'foo ';
exitstatus 78
return "$?"
elif [ "$1" = "two" ]; then
printf 'baz ';
exitstatus 89
return
else
printf 'baz ';
exitstatus 90
fi
}
Stampa:
$ ./script
foo 78
baz 89
baz 90
L'unico uso pratico per "$?"
è stampare il suo valore: echo "$?"
o memorizzarlo in una variabile (in quanto è un valore effimero e cambiare ad ogni comando eseguito): exitstatus=$?
(ricordati di citare la variabile in comandi come export EXITSTATUS="$?"
.
Nel return
comando, l'intervallo di valori valido è generalmente compreso tra 0 e 255, ma è necessario comprendere che i valori di 126 + n
vengono utilizzati da alcune shell per segnalare uno stato di uscita speciale, quindi la raccomandazione generale è di utilizzare 0-125.
return
è che per funzioni definite comef() (...; cmd; return)
, impedisce l'ottimizzazione che alcune shell eseguonocmd
nello stesso processo della subshell. Con molte shell, ciò significa anche che lo stato di uscita della funzione non porta le informazioni checmd
sono state uccise quando presenti (la maggior parte delle shell non può comunque recuperare tali informazioni).