スクリプトが別のスクリプトを呼び出すと、親スクリプトの変数をエクスポートして、子スクリプトに表示することができます。関数のエクスポートは明白な一般化です。親から関数をエクスポートし、子で可視にします。
環境は、プロセスが任意のデータをその子に渡すことができる唯一の便利な方法です。データはnullバイトを含まない文字列にマーシャリングする必要がありますが、これはシェル関数にとっては困難ではありません。共有メモリブロックやファイル記述子を介して渡される一時ファイルなどの他の潜在的な方法がありますが、これらは、それらをどうするかわからない、またはそれらを閉じる中間プログラムで問題を引き起こす可能性があります。プログラムは、自分が知らないか気にしない変数を含む環境で実行することを期待しているため、それらを上書きしたり消去したりすることはありません。
関数名を環境変数の名前として使用するという選択は奇妙なものです。1つには、エクスポートされた変数が、同じ名前のエクスポートされた関数と競合することを意味します。
エクスポートされた関数は古い機能です。関数はSVR2のBourneシェルに追加され、同じ年にリリースされたバージョン8シェルのエクスポートされた関数(1984)です。そのシェルでは、変数と関数は同じ名前空間を使用していました。関数のエクスポートがどのように機能したかわかりません。家宝シェルは機能を持っていますが、それらをエクスポートしませんボーンバリアントに基づいています。
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は、エクスポート機能をサポートしていません。