¿Es posible tratar un bloque de comandos como una función anónima?
function wrap_this {
run_something
# Decide to run block or maybe not.
run_something else
}
wrap_this {
do_something
do_somthing else
}
# Do something else
wrap_this {
do_something_else_else
do_something_else_else_else
}
(Me doy cuenta de que crea una función o un archivo para cada bloque, pero creo que esta opción es más clara y fácil de leer en ciertas situaciones).
while
lo hace con do/done
y function
lo hace con { multiple lines }
. Me doy cuenta de que BASH no tiene funciones anónimas, pero ¿es posible pasar múltiples comandos a otra función, como puede hacer al definir una función o while
?
Respuestas:
Esta es la solución más corta que se me ocurre:
Dadas estas funciones:
Ejemplos:
(Estos ejemplos son, por supuesto, solo ejemplos de uso, y en realidad, este estilo solo tendría sentido para casos de uso más complicados).
En general, siempre se puede usar el siguiente estilo:
No es del todo lambda, pero está muy, muy cerca. Solo unos pocos caracteres en exceso.
Pero cualquiera de las siguientes abreviaturas de conveniencia no funciona hasta donde puedo decir:
Desafortunadamente,
bash
no es muy adecuado para este estilo, aunque algunas de sus características tienen un estilo muy funcional.fuente
Me las arreglé para hacer lo que quieres con un
eval
truco. Con esto advertí que eval es inseguro y que debes evitarlo a toda costa . Dicho esto, si confía en que no se abusará de su código, puede usar esto:Esto le permite ejecutar el código de la siguiente manera:
No es exactamente ideal, ya que el bloque interno es una cadena, pero crea reutilización.
fuente
!!
para evitar la sustitución en heredoc. stackoverflow.com/questions/27920806/…Se puede poner el código en una cadena y pasarlo a
eval
osh
o simplemente interpolar ella.Sin embargo, puede terminar rápidamente en problemas de citas.
fuente
perform { echo "moo" \n echo "moo moo" \n echo "moo moo moo" }
. Ya sabía que puedes pasar un comando. Pero, estoy buscando varias líneas, no solo un comando o una línea. Gracias por intentarlo.No, bash no tiene funciones anónimas. Sin embargo, es posible pasar un nombre de función y argumentos como cadenas y hacer que bash lo llame.
Sin embargo, esto es algo limitado. Tratar de citar puede convertirse en un problema. Pasar más de un comando también es una complicación.
fuente
$*
a"$@"
wrap my_func "$arg1" "$arg2"
. Mi única objeción con este ejemplo es que el valor de retorno de "$ @" se pierde, pero eso se soluciona fácilmente. Puede ser deseable envolver "$ @"()
para garantizar que los cambios ambientales no se filtren, con algún costo de rendimiento de bifurcación.