Est-il possible de traiter un bloc de commandes comme une fonction anonyme?
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
}
(Je me rends compte que vous créez une fonction ou un fichier pour chaque bloc, mais je trouve cette option plus claire et plus facile à lire dans certaines situations.)
while
le fait avec do/done
et le function
fait avec { multiple lines }
. Je me rends compte que BASH n'a pas de fonctions anonymes, mais est-il possible de passer plusieurs commandes à une autre fonction, comme vous pouvez le faire lors de la définition d'une fonction ou while
?
Réponses:
C'est la solution la plus courte à laquelle je pouvais penser:
Compte tenu de ces fonctions:
Exemples:
(Ces exemples ne sont bien sûr que des exemples d'utilisation, et en réalité, ce style n'aurait de sens que pour des cas d'utilisation plus compliqués.)
Généralement, le style suivant peut toujours être utilisé:
Ce n'est pas tout à fait lambda, mais c'est très très proche. Seulement quelques excès de caractères.
Mais aucune des abréviations de commodité suivantes ne fonctionne pour autant que je sache:
Malheureusement,
bash
n'est pas très bien adapté à ce style, même si certaines de ses fonctionnalités ont un style très fonctionnel.la source
J'ai réussi à faire ce que tu veux avec un
eval
hack. Sur ce, je mets en garde contre le fait que l' eval n'est pas sûr et que vous devez éviter à tout prix . Cela dit, si vous pensez que votre code ne sera pas utilisé abusivement, vous pouvez utiliser ceci:Cela vous permet d'exécuter du code comme suit:
Pas exactement idéal, car le bloc interne est une chaîne, mais crée une réutilisation.
la source
!!
afin d'empêcher la substitution dans heredoc. stackoverflow.com/questions/27920806/…Vous pouvez mettre du code dans une chaîne et le passer à
eval
oush
ou simplement l'interpoler.Cependant, vous pouvez rapidement vous retrouver dans de gros problèmes de cotation.
la source
perform { echo "moo" \n echo "moo moo" \n echo "moo moo moo" }
. Je savais déjà que vous pouvez passer une commande. Mais, je recherche plusieurs lignes, pas seulement une commande ou une ligne. Merci d'avoir essayé.Non, bash n'a pas de fonctions anonymes. Il est cependant possible de passer un nom de fonction et des arguments sous forme de chaînes et que bash l'appelle.
Ceci est cependant quelque peu limité. Le traitement des devis peut devenir un problème. Passer plusieurs commandes est également une complication.
la source
$*
pour"$@"
wrap my_func "$arg1" "$arg2"
. Mon seul problème avec cet exemple est que la valeur de retour de "$ @" est perdue, mais cela est facilement corrigé. Il peut être souhaitable d'envelopper "$ @" avec()
pour s'assurer que les changements environnementaux ne fuient pas, à un certain coût de performance.