Cuando una secuencia de comandos invoca otra secuencia de comandos, las variables de la secuencia de comandos principal se pueden exportar y luego serán visibles en la secuencia de comandos secundaria. Exportar funciones es una generalización obvia: exportar la función desde el padre, hacerla visible en el hijo.
El entorno es la única forma conveniente en que un proceso puede pasar datos arbitrarios a sus hijos. Los datos deben agruparse en cadenas que no contengan bytes nulos, lo que no es una dificultad para las funciones de shell. Existen otros métodos potenciales, como bloques de memoria compartida o archivos temporales pasados a través de descriptores de archivos, pero estos podrían causar problemas con programas intermedios que no saben qué hacer con ellos o los cerrarían. Los programas esperan ejecutarse en un entorno que contiene variables que no conocen o no les importan, por lo que no las sobrescribirán ni las borrarán.
La elección de usar el nombre de la función como el nombre de la variable de entorno es extraña. Por un lado, significa que una variable exportada choca con una función exportada del mismo nombre.
Las funciones exportadas son una característica antigua. Se agregaron funciones en el shell Bourne en SVR2 , y las funciones exportadas en el shell de la Versión 8 lanzadas el mismo año (1984). En ese shell, las variables y funciones utilizan el mismo espacio de nombres. No sé cómo funcionó la exportación de funciones. El shell Heirloom se basa en una variante Bourne que tiene funciones pero no las exporta.
ATT ksh supuestamente admite funciones de exportación, pero al mirar la fuente o jugar con ella, no puedo ver que lo haga, a 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
Los clones de dominio público de Ksh (pdksh, mksh), dash y zsh no admiten funciones de exportación.