Je lis ce post sur l'utilisation des fonctions dans les variables shell bash. J'observe que pour utiliser les fonctions du shell, il faut les exporter et les exécuter dans un shell enfant comme suit :
$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function
Je veux demander s'il est possible de définir des fonctions dans des variables shell bash de sorte qu'elles puissent être exécutées dans le shell actuel sans utiliser l'exportation et l'exécution d'un nouveau shell ?
Réponse acceptée :
Non, vous ne pouvez pas.
Si vous souhaitez utiliser une fonction dans le shell actuel, définissez-la simplement puis utilisez-la plus tard :
$ foo() { echo "Inside function"; }
$ foo
Inside function
Avant le jour de Shellshock, vous pouvez stocker une fonction dans une variable, exporter une variable et utiliser une fonction dans un sous-shell, car bash
prend en charge la fonction d'exportation, bash
mettra la définition de la fonction dans une variable d'environnement comme :
foo=() {
echo "Inside function"
}
puis interprétez la fonction en remplaçant =
avec de l'espace. Il n'y a aucune intention de mettre la fonction dans la variable et de se référer à la variable pour exécuter la fonction.
Maintenant, après que Stéphane Chazelas ait trouvé le bogue, cette fonctionnalité a été supprimée, plus aucune définition de fonction n'est stockée dans une variable d'environnement simple. Désormais, les fonctions exportées seront encodées en ajoutant le préfixe BASH_FUNC_
et le suffixe %%
pour éviter les conflits avec les variables d'environnement. bash
L'interpréteur peut désormais déterminer s'il s'agit ou non d'une fonction shell, quel que soit le contenu des variables. Vous devez également définir la fonction et l'exporter explicitement pour l'utiliser en sous-shell :
$ foo() { echo "Inside function"; }
$ export -f foo
$ bash -c foo
Inside function
Quoi qu'il en soit, si votre exemple a fonctionné avec votre bash
actuel , alors vous utilisez une version vulnérable.