はい、VMS を使用します。
これは最も実用的なアドバイスではないかもしれませんが、完全です。:)
VMS は...違います。VMS と Unix は、おそらく Windows と Unix よりも異なっています。Perl は Unix の考え方に基づいて構築されており、VMS のやり方にラップするために、これらの Unix の概念のいくつかを限界点まで拡張する必要があります。その一つが%ENV
意味です。
VMS には、Unix のような環境変数はありません。VMS に最も近いものは論理名です。これらはキーと値のペアのテーブルであり、環境変数とシェル エイリアスの両方と同様の目的を果たします。Unix の環境変数とは異なり、Ogre と同様に、レイヤーがあります。
OpenVMS コンサルタントから: 論理名 (パート 1) :
ほとんどのプロセスは、少なくとも 4 つの論理名テーブル (プロセス、ジョブ、グループ、およびシステム) に関連付けられています。名前は通常、最初にプロセス、ジョブ、グループ、およびシステム テーブルを階層順に検索することによって変換されます。上級ユーザーは、検索および翻訳プロセスを制御できます。さらに、一部の翻訳では、セキュリティと整合性の理由から、エンド ユーザーによって定義された論理名が除外されます。
Unix では、環境テーブルはプロセスにコピーされるため、そのプロセスはその親に影響を与えることはできません。VMS では、論理テーブルはスタックです。VMS は、値が見つかるまでそのスタックを読み取ります。たとえば、たとえばSYS$OUTPUT
(のようなSTDOUT
) の値を要求すると、最初にプロセスの論理テーブルがチェックされ、次にジョブ、次にグループ、最後にシステム全体の値がチェックされます。このようにして、オペレーティング システムはSYS$OUTPUT
システム テーブルにデフォルトを定義できますが、それはユーザーまたは単一のプロセスによって上書きされる可能性があります。
これが複雑に思える場合、実際には実際に起こることを単純化したものです。
ロジカルはスタックなので、1 つ設定するとどうなるでしょうか?
最後に、この回答のポイント$ENV{FOO} = "BAR"
まで、論理テーブル スタックを検索し、最初に見つかった FOO に割り当てます。プロセス テーブルに 1 つある場合は、それに割り当てられます。ジョブ テーブルに 1 つある場合は、それに割り当てられます。というように、書き込み許可の制限に達するまで続きます。その時点で、最上位のテーブル (おそらくジョブ テーブル) に新しいエントリが作成されます。つまり$ENV{FOO} = "BAR"
、ジョブ テーブルに配置される可能性が非常に高いため、すべてのプロセスで表示されます。
これが、あるプロセスで Perl の環境変数を設定し、別のプロセスにエクスポートする方法です。