是的,使用 VMS。
这可能不是最实用的建议,但它是完整的。:)
VMS 是……不同的。VMS 和 Unix 可能比 Windows 和 Unix 更不同。Perl 是围绕 Unix 思维构建的,并且必须将这些 Unix 概念中的一些延伸到断点,以便将它们包装在 VMS 的做事方式上。其中之一是什么%ENV
意思。
VMS 没有 Unix 那样的环境变量。VMS 最接近的东西是逻辑名称。它们是一个键/值对表,其用途类似于环境变量和 shell 别名。与 Unix 上的环境变量和 Ogres 不同,它们有层。
来自OpenVMS 顾问:逻辑名称(第 1 部分):
大多数进程与至少四个逻辑名称表(进程、作业、组和系统)相关联。通常通过首先按层次顺序搜索 Process、Job、Group 和 System 表来翻译名称。高级用户可以控制搜索和翻译过程。此外,出于安全和完整性原因,某些翻译排除了最终用户定义的逻辑名称。
在 Unix 上,环境表被复制到一个进程中,因此该进程不会对其父进程产生任何影响。在 VMS 上,逻辑表是一个堆栈。VMS 读取该堆栈,直到找到一个值。例如,如果您要求SYS$OUTPUT
(例如STDOUT
)的值,它将首先检查进程的逻辑表,然后是作业,然后是组,最后是整个系统的值。通过这种方式,操作系统可以SYS$OUTPUT
在系统表中定义一个默认值,但它可以被您或单个进程覆盖。
如果这看起来很复杂,它实际上是对真正发生的事情的简化。
逻辑是一个堆栈,那么如果你设置一个会发生什么?
最后,对于这个答案,$ENV{FOO} = "BAR"
将查找逻辑表堆栈并分配给它找到的第一个 FOO。如果进程表中有一个,它将分配给它。如果工作表中有一个,它将分配给它。以此类推,直到达到其写入权限的限制。此时它将在其最高的表中创建一个新条目,可能是作业表。这意味着$ENV{FOO} = "BAR"
很可能会出现在工作表中,因此您的所有流程都可以看到。
这就是在 Perl 中在一个进程中设置环境变量并导出到另一个进程的方式。