Lorsqu'un script appelle un autre script, les variables du script parent peuvent être exportées, puis elles seront visibles dans le script enfant. L'exportation de fonctions est une généralisation évidente: exportez la fonction du parent, rendez-la visible chez l'enfant.
L'environnement est le seul moyen pratique pour un processus de transmettre des données arbitraires à ses enfants. Les données doivent être rassemblées en chaînes qui ne contiennent pas d'octets nuls, ce qui n'est pas une difficulté pour les fonctions shell. Il existe d'autres méthodes potentielles, telles que des blocs de mémoire partagée ou des fichiers temporaires transmis via des descripteurs de fichiers, mais ceux-ci pourraient provoquer des problèmes avec des programmes intermédiaires qui ne savent pas quoi faire avec eux ou les fermeraient. Les programmes s'attendent à s'exécuter dans un environnement qui contient des variables qu'ils ne connaissent pas ou dont ils ne se soucient pas, donc ils ne vont pas les écraser ni les effacer.
Le choix d'utiliser le nom de la fonction comme nom de la variable d'environnement est étrange. D'une part, cela signifie qu'une variable exportée se heurte à une fonction exportée du même nom.
Les fonctions exportées sont une ancienne fonctionnalité. Des fonctions ont été ajoutées dans le shell Bourne dans SVR2 , et des fonctions exportées dans le shell version 8 publiées la même année (1984). Dans ce shell, les variables et les fonctions utilisaient le même espace de noms. Je ne sais pas comment a fonctionné l'exportation de fonctions. Le shell Heirloom est basé sur une variante Bourne qui a des fonctions mais ne les exporte pas.
ATT ksh prend soi-disant en charge l'exportation de fonctions, mais en regardant la source ou en jouant avec, je ne peux pas voir que c'est le cas, à partir de ksh93u.
env -i /usr/bin/ksh -c 'f=variable; f () { echo function; }; typeset -fx f; /usr/bin/env; ksh -c f'
_=*25182*/usr/bin/env
PWD=/home/gilles
SHLVL=1
A__z="*SHLVL
ksh: f: not found
Les clones du domaine public de Ksh (pdksh, mksh), dash et zsh ne prennent pas en charge les fonctions d'exportation.