37 votes

Fonctions anonymes dans les scripts shell

Est-il possible de créer quelque chose d'analogique à une fonction anonyme dont la valeur peut être attribuée à un élément de tableau et ensuite appelée? Je ne trouve pas de moyen de le faire dans un script bash mais peut-être qu'il y a une solution de contournement.

80voto

Ignacio Vazquez-Abrams Points 312628

Réponse courte : Non.

Réponse longue : Nooooooooooooo.

Réponse complète : Les fonctions en bash ne sont pas des objets de première classe, donc il ne peut pas y avoir de fonction anonyme en bash.

19voto

Spencer Tipping Points 151

Il est possible; J'ai écrit une bibliothèque pour faire exactement cela, même si c'est un projet très étrange. Le code source est disponible sur http://github.com/spencertipping/bash-lambda. Utilisation de cette bibliothèque :

$ my_array=()
$ my_array[0]=$(fn x 'echo $((x + 1))')
$ my_array[1]=$(fn x 'echo $((x + 2))')
$ ${my_array[0]} 5
6
$ ${my_array[1]} 5
7
$

Le truc est d'avoir la fonction fn créer un fichier contenant le corps de la fonction, exécuter chmod +x sur ce fichier, puis retourner son nom. Cela provoque l'accumulation de fichiers indésirables, c'est pourquoi la bibliothèque implémente également un garbage collector asynchrone mark/sweep.

10voto

choroba Points 56333

Si vous avez vraiment besoin d'un tableau pour stocker les fonctions, vous pouvez définir des fonctions nommées et stocker uniquement leurs noms. Vous pouvez ensuite appeler la fonction comme ${array[n]}. Ou vous pouvez les nommer func1 .. funcN et ensuite simplement appeler func$n.

9voto

William Pursell Points 56211

La technique commune consiste à assigner des définitions de fonctions de manière conditionnelle :

#!/bin/sh

case $1 in
a) foo() { echo case a; };;
b) foo() { echo case b; };;
\*) foo() { echo default; } ;;
esac

foo

1voto

slaxor Points 114

Eh bien, bash est complet turing, donc c'est parfaitement possible ;)

mais à part ça, cela ne vaut pas vraiment la peine d'être considéré.

vous pourriez toutefois simuler un tel comportement avec quelque chose comme ceci :

echo myval ; ( foocmd "$_" && barcmd "$_" )

mais pourquoi ?!?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X