Solución:
Aunque bash tiene un return
declaración, lo único que puede especificar con ella es la propia función exit
estado (un valor entre 0
y 255
, 0 significa “éxito”). Entonces return
no es lo que quieres.
Es posible que desee convertir su return
declaración a un echo
declaración: de esa manera, la salida de su función podría capturarse usando $()
llaves, que parece ser exactamente lo que quieres.
Aquí hay un ejemplo:
function fun1(){
echo 34
}
function fun2(){
local res=$(fun1)
echo $res
}
Otra forma de obtener el valor de retorno (si solo desea devolver un número entero 0-255) es $?
.
function fun1(){
return 34
}
function fun2(){
fun1
local res=$?
echo $res
}
Además, tenga en cuenta que puede usar el valor de retorno para usar lógica booleana como fun1 || fun2
solo correrá fun2
Si fun1
devuelve un no0
valor. El valor de retorno predeterminado es el valor de salida de la última instrucción ejecutada dentro de la función.
$(...)
captura el texto enviado a stdout por el comando contenido dentro. return
no se envía a stdout. $?
contiene el código de resultado del último comando.
fun1 (){
return 34
}
fun2 (){
fun1
local res=$?
echo $res
}
Las funciones en Bash no son funciones como en otros lenguajes; en realidad son comandos. Por lo tanto, las funciones se utilizan 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 conductos (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 tal cosa como 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 --help
salida del comando, pero ambos son solo legibles por humanos y, por lo tanto, están escritos al viento.
Cuando un comando quiere obtener una entrada, lo 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, tiene que echo
a su flujo de salida. Otra forma que se practica a menudo es almacenar el valor de retorno en variables globales dedicadas. Escribir en el flujo de salida es más claro y 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 una ventaja que otros lenguajes 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 dejar esto en claro: return
(como 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 proporcionas un valor explícito con return
el estado se toma del último comando en una instrucción / función / comando de Bash y así sucesivamente. Así que siempre hay un estado y return
es solo una forma fácil de proporcionarlo.