Diferencia entre retorno y salida en funciones Bash
¿ Cuál es la diferencia entre la declaración return
y exit
en las funciones Bash con respecto a los códigos de salida?
Desde man bash
el return [n]
;
Hace que una función deje de ejecutarse y devuelva el valor especificado por n a su llamador. Si se omite n, el estado de retorno es el del último comando ejecutado en el cuerpo de la función.
... en exit [n]
:
Hacer que el shell salga con un estado de n. Si se omite n, el estado de salida es el del último comando ejecutado. Se ejecuta una trampa al SALIR antes de que finalice el shell.
EDITAR:
Según su edición de la pregunta, con respecto a los códigos de salida, return
no tiene nada que ver con los códigos de salida. Los códigos de salida están destinados a aplicaciones/scripts , no a funciones. Entonces, en este sentido, la única palabra clave que establece el código de salida del script (el que puede ser capturado por el programa que llama usando la $?
variable de shell) es exit
.
EDITAR 2:
Mi última afirmación al respecto exit
está provocando algunos comentarios. Fue creado para diferenciar return
y exit
comprender el OP y, de hecho, en cualquier punto dado de un programa/script de shell, exit
es la única forma de finalizar el script con un código de salida para el proceso de llamada.
Cada comando ejecutado en el shell produce un "código de salida" local: establece la $?
variable en ese código y se puede usar con if
y &&
otros operadores para ejecutar condicionalmente otros comandos.
Estos códigos de salida (y el valor de la $?
variable) se restablecen con cada ejecución de comando.
Por cierto, el código de salida del último comando ejecutado por el script se utiliza como código de salida del propio script tal como lo ve el proceso de llamada.
Finalmente, las funciones, cuando se llaman, actúan como comandos de shell con respecto a los códigos de salida. El código de salida de la función ( dentro de la función) se establece mediante return
. Entonces, cuando return 0
se ejecuta una función, la ejecución de la función finaliza, dando un código de salida de 0.
return
hará que la función actual quede fuera de alcance, mientras que exit
hará que el script finalice en el punto donde se llama. Aquí hay un programa de muestra para ayudar a explicar esto:
#!/bin/bash
retfunc()
{
echo "this is retfunc()"
return 1
}
exitfunc()
{
echo "this is exitfunc()"
exit 1
}
retfunc
echo "We are still here"
exitfunc
echo "We will never see this"
Producción
$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()
No creo que nadie haya respondido completamente la pregunta porque no describen cómo se usan los dos. Bien, creo que sabemos que la salida mata el script, dondequiera que se llame y también se le puede asignar un estado, como salida o salida 0 o salida 7, etc. Esto se puede utilizar para determinar cómo se forzó la detención del script si otro script lo llama, etc. Suficiente al salir .
return , cuando se llama, devolverá el valor especificado para indicar el comportamiento de la función, generalmente un 1 o un 0. Por ejemplo:
#!/bin/bash
isdirectory() {
if [ -d "$1" ]
then
return 0
else
return 1
fi
echo "you will not see anything after the return like this text"
}
Comprueba así:
if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi
O así:
isdirectory || echo "not a directory"
En este ejemplo, la prueba se puede utilizar para indicar si se encontró el directorio. Tenga en cuenta que cualquier cosa después del retorno no se ejecutará en la función. 0 es verdadero, pero falso es 1 en el shell, a diferencia de otros lenguajes de programación.
Para obtener más información sobre funciones: Devolver valores de funciones Bash
Nota : La función isdirectory tiene únicamente fines instructivos. Esta no debería ser la forma en que se realiza dicha opción en un script real.*