Las funciones en Bash no son funciones como en otro idioma; en realidad son comandos. Por lo tanto, las funciones se usan como si fueran binarios o scripts extraídos de su ruta. Desde la perspectiva de la lógica de su programa, realmente no debería haber diferencia.
Los comandos de Shell están conectados por canalizaciones (también conocidos como flujos) y no por tipos de datos fundamentales o definidos por el usuario, como en los lenguajes de programación "reales". No existe un valor de retorno para un comando, tal vez principalmente porque no hay una forma real de declararlo. Podría ocurrir en la página de manual o en la --helpsalida del comando, pero ambos son legibles por humanos y, por lo tanto, están escritos al viento.
Cuando un comando quiere obtener una entrada, la lee de su flujo de entrada o de la lista de argumentos. En ambos casos, las cadenas de texto deben analizarse.
Cuando un comando quiere devolver algo, debe echohacerlo en su flujo de salida. Otra forma practicada a menudo es almacenar el valor de retorno en variables dedicadas y globales. Escribir en la secuencia de salida es más claro y más flexible, porque también puede tomar datos binarios. Por ejemplo, puede devolver un BLOB fácilmente:
encrypt() {
gpg -c -o- $1 # encrypt data in filename to stdout (asks for a passphrase)
}
encrypt public.dat > private.dat # write function result to file
Como otros han escrito en este hilo, la persona que llama también puede usar la sustitución de comandos $()para capturar la salida.
Paralelamente, la función "devolvería" el código de salida de gpg(GnuPG). Piense en el código de salida como un bono que otros idiomas no tienen o, dependiendo de su temperamento, como un "Schmutzeffekt" de funciones de shell. Este estado es, por convención, 0 en caso de éxito o un número entero en el rango 1-255 para otra cosa. Para aclarar esto: return(like exit) solo puede tomar un valor de 0-255, y los valores distintos de 0 no son necesariamente errores, como se afirma a menudo.
Cuando no proporciona un valor explícito, returnel estado se toma del último comando en una declaración / función / comando Bash, etc. Por lo tanto, siempre hay un estado y returnes solo una forma fácil de proporcionarlo.
returnen su caso es esencialmente el mismoexit codeque el rango de0 - 255. Useechosegún lo sugerido por @septi. Los códigos de salida se pueden capturar con$?.