Cela n'est pas possible sous Unix. Pour mieux comprendre, il faut savoir ce qu'est une variable. Bash conserve deux tables internes contenant toutes les variables définies. L'une d'entre elles contient les variables locales à l'interpréteur de commandes actuel. Vous pouvez les créer avec set name=value
ou simplement name=value
. Elles sont locales au processus ; elles ne sont pas héritées lors de la création d'un nouveau processus.
Pour exporter une variable vers de nouveaux processus enfants, vous devez l'exporter avec l'option export name
. Cela dit à bash "Je veux que les enfants voient la valeur de cette variable". C'est une mesure de sécurité.
Lorsque vous invoquez une fonction en bash, elle est exécutée dans le contexte de l'interpréteur de commandes actuel, ce qui lui permet d'accéder à toutes les variables et de les modifier.
Mais un tuyau est une liste de processus qui sont connectés avec des tuyaux d'entrée/sortie. Cela signifie que votre fonction est exécutée dans un shell et que seule la sortie de ce shell est visible par echo
.
Même l'exportation en myfunc
ne fonctionnerait pas parce que l'exportation ne fonctionne que pour les processus lancés par le shell où vous avez effectué l'exportation et que echo
a été lancé par le même shell que myfunc
:
bash
+-- myfunc
+-- echo
c'est-à-dire echo
n'est pas un enfant de myfunc
.
Solutions de contournement :
- Écriture de la variable dans un fichier
- Utilisez un format de sortie plus complexe comme XML ou plusieurs lignes où la première ligne de sortie est toujours la variable et la vraie sortie vient dans la ligne suivante.