Diferencia entre retorno y salida en funciones Bash

Resuelto lecodesportif asked hace 13 años • 11 respuestas

¿ Cuál es la diferencia entre la declaración returny exiten las funciones Bash con respecto a los códigos de salida?

lecodesportif avatar Dec 12 '10 08:12 lecodesportif
Aceptado

Desde man bashel 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, returnno 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 exitestá provocando algunos comentarios. Fue creado para diferenciar returny exitcomprender el OP y, de hecho, en cualquier punto dado de un programa/script de shell, exites 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 ify &&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 0se ejecuta una función, la ejecución de la función finaliza, dando un código de salida de 0.

Diego Sevilla avatar Dec 12 '2010 01:12 Diego Sevilla

returnhará que la función actual quede fuera de alcance, mientras que exithará 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()
SiegeX avatar Dec 12 '2010 01:12 SiegeX

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.*

Mike Q avatar Oct 16 '2013 11:10 Mike Q