Bashが環境変数に入力された内容を解析/実行するのはなぜですか?

Bashが環境変数に入力された内容を解析/実行するのはなぜですか?

これシェルショックBashのバグは環境変数を介して動作します。正直なところ、このような機能があることは驚くべきことです。

「環境変数を介して関数定義を渡す」

したがって、この質問は完璧ではありませんが、この機能が必要な例やケースを尋ねることです。

追加の利点。 zsh、dashなどの他のシェルにもこの機能はありますか?

ベストアンサー1

あるスクリプトが別のスクリプトを呼び出すと、親スクリプトの変数をエクスポートしてサブスクリプトに表示できます。関数のエクスポートは明らかな一般化です。つまり、親から関数をエクスポートして子に表示できるようにします。

環境は、プロセスが任意のデータを子に渡す唯一の便利な方法です。データはヌルバイトを含まない文字列にマーシャリングする必要があり、これはシェル関数にとって難しくありません。共有メモリブロックやファイルディスクリプタを介して渡される一時ファイルなどの他の潜在的な方法がありますが、これらの方法はこれを行う方法を知らないか閉じる仲介プログラムに問題を引き起こす可能性があります。プログラムは、自分が知らない、または気にしない変数を含む環境で実行されることを期待しているため、その変数を上書きまたは削除しません。

環境変数の名前として関数名を使用する選択は、奇妙な選択です。一方、これはエクスポートされた変数が同じ名前のエクスポートされた関数と競合することを意味します。

関数のエクスポートは古い機能です。 Bourne シェルに追加された機能SVR2ではおよびエクスポートされた関数バージョン 8 シェル同年(1984年)に発売された。このシェルは、変数と関数が同じ名前空間を使用します。関数のエクスポートがどのように機能するかわかりません。これガボシェル機能はあるがエクスポートされない 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のパブリックドメインレプリカはエクスポート機能をサポートしません。

おすすめ記事