Quando uno script richiama un altro script, le variabili dello script principale possono essere esportate e quindi saranno visibili nello script figlio. Esportare funzioni è una generalizzazione ovvia: esportare la funzione dal genitore, renderla visibile nel figlio.
L'ambiente è l'unico modo conveniente in cui un processo può trasmettere dati arbitrari ai propri figli. I dati devono essere raggruppati in stringhe che non contengono byte null, il che non è una difficoltà per le funzioni della shell. Esistono altri metodi potenziali, come blocchi di memoria condivisa o file temporanei passati tramite descrittori di file, ma questi potrebbero causare problemi con programmi intermedi che non sanno cosa farne o li chiudono. I programmi prevedono di essere eseguiti in un ambiente che contiene variabili di cui non sono a conoscenza o che non si preoccupano, quindi non verranno sovrascritte o cancellate.
La scelta di usare il nome della funzione come nome della variabile d'ambiente è strana. Per prima cosa, significa che una variabile esportata si scontra con una funzione esportata con lo stesso nome.
Le funzioni esportate sono una vecchia funzionalità. Le funzioni furono aggiunte nella shell Bourne in SVR2 e le funzioni esportate nella shell Versione 8 furono rilasciate lo stesso anno (1984). In quella shell, variabili e funzioni utilizzavano lo stesso spazio dei nomi. Non so come funzionasse l'esportazione. La shell Heirloom si basa su una variante Bourne che ha funzioni ma non le esporta.
ATT ksh presumibilmente supporta le funzioni di esportazione, ma guardando la fonte o giocando con esso, non riesco a vedere che lo fa, a partire da 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
I cloni di dominio pubblico di Ksh (pdksh, mksh), dash e zsh non supportano le funzioni di esportazione.