Sí, el valor de retorno implícito de una función es el estado de salida del último comando ejecutado . Eso también es cierto en cualquier punto de cualquier script de shell. En cualquier punto de la secuencia de ejecución del script, el estado de salida actual es el estado de salida del último comando ejecutado. Incluso comando ejecutado como parte de una asignación de variables: var=$(exit 34)
. La diferencia con las funciones es que una función podría cambiar el estado de salida al final de la ejecución de la función.
La forma alternativa de cambiar el "estado de salida actual" es iniciar un shell secundario y salir con cualquier estado de salida necesario:
$ $(exit 34)
$ echo "$?"
34
Y sí, es necesario citar la expansión del estado de salida :
$ IFS='123'
$ $(exit 34)
$ echo $?
4
A (exit 34)
también trabajo.
Algunos pueden argumentar que una construcción más robusta debería ser $(return 34)
, y que una salida debería "salir" del script que se está ejecutando. Pero $(return 34)
no funciona con ninguna versión de bash. Por lo tanto, no es portátil.
La forma más segura de establecer un estado de salida es usarlo tal como fue diseñado para trabajar, definir y return
desde una función:
exitstatus(){ return "${1:-"$?"}"; }
Entonces, al final de una función. es exactamente equivalente a tener nada o return
o return "$?"
. El final de una función no necesita significar la "última línea de código de una función".
#!/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
}
Imprimirá:
$ ./script
foo 78
baz 89
baz 90
El único uso práctico para "$?"
es imprimir su valor: echo "$?"
o almacenarlo en una variable (ya que es un valor efímero y cambiar con cada comando ejecutado): exitstatus=$?
(recuerde citar la variable en comandos como export EXITSTATUS="$?"
.
En el return
comando, el rango de valores válido es generalmente de 0 a 255, pero comprenda que 126 + n
algunos shells usan valores de para indicar un estado de salida especial, por lo tanto, la recomendación general es usar 0-125.
return
es que para funciones definidas comof() (...; cmd; return)
, evita la optimización que hacen algunos shells al ejecutarcmd
el mismo proceso que el subshell. Con muchos shells, eso también significa que el estado de salida de la función no contiene la información quecmd
se eliminó cuando la tiene (la mayoría de los shells no pueden recuperar esa información de todos modos).