Когда скрипт вызывает другой скрипт, переменные родительского скрипта можно экспортировать, и тогда они будут видны в дочернем скрипте. Экспорт функций является очевидным обобщением: экспортируйте функцию из родительской, сделайте ее видимой в дочерней.
Среда является единственным удобным способом, которым процесс может передавать произвольные данные своим дочерним элементам. Данные должны быть упорядочены в строки, которые не содержат нулевых байтов, что не составляет труда для функций оболочки. Существуют и другие потенциальные методы, такие как блоки совместно используемой памяти или временные файлы, передаваемые через файловые дескрипторы, но они могут вызвать проблемы с промежуточными программами, которые не знают, что с ними делать, или закрывают их. Программы ожидают запуска в среде, содержащей переменные, которые они не знают или не заботятся, поэтому они не будут перезаписывать или стирать их.
Выбор использования имени функции в качестве имени переменной среды является странным. С одной стороны, это означает, что экспортируемая переменная конфликтует с экспортируемой функцией с тем же именем.
Экспортируемые функции - старая особенность. Функции были добавлены в оболочку Bourne в SVR2 , а экспортированные функции были добавлены в оболочку версии 8 в том же году (1984). В этой оболочке переменные и функции использовали одно и то же пространство имен. Я не знаю, как работал экспорт функций. Heirloom оболочки основана на варианте Bourne , который имеет функции , но не экспортировать их.
ATT ksh предположительно поддерживает экспорт функций, но, глядя на источник или играя с ним, я не вижу, что он делает, начиная с 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
Общедоступные клоны Ksh (pdksh, mksh), dash и zsh не поддерживают функции экспорта.