perl - 有没有办法在 Perl 中设置环境变量并将其导出到脚本范围之外?

你可以读取一个环境变量

$envVarVal = $ENV{'VAR_NAME'};

反向设置是行不通的,也就是说,一旦脚本运行完毕,您将看不到 var:

$ENV{'VAR_NAME'} = 'some_val';

我还尝试了一个系统调用:

`export VAR_NAME=some_val`;

调用在 Perl 脚本中成功,但变量在范围外仍然不可见。

是否有可能做到这一点,如果不能,为什么不能在 Perl 中做到这一点,而是通过采购一个常规的 shell 脚本,据我所知,任何 shell?

最佳答案

是的,使用 VMS。

这可能不是最实用的建议,但它是完整的。 :)

VMS 是……不同的。 VMS 和 Unix 可能比 Windows 和 Unix 更加不同。 Perl 是围绕 Unix 思维模式构建的,并且必须将其中一些 Unix 概念扩展到突破点,以便将它们包装在 VMS 的做事方式周围。其中之一就是 %ENV 的含义。

VMS 没有 Unix 那样的环境变量。 VMS 最接近的是 logical names .它们是一个键/值对表,其作用类似于环境变量和 shell 别名。与 Unix 上的环境变量不同,也与 Ogres 一样,它们具有层次。

来自 The OpenVMS Consultant: Logical Names (Part 1) :

Most processes are associated with at least four logical name tables (Process, Job, Group, and System). Names are generally translated by first searching in hierarchical sequence the Process, Job, Group and System tables. Advanced users can control the search and translation process. Additionally, some translations preclude logical names defined by end-users, for security and integrity reasons.

在 Unix 上,环境表被复制到一个进程中,因此该进程不能对其父进程产生任何影响。在 VMS 上,逻辑表是一个堆栈。 VMS 读取该堆栈,直到它找到一个值。例如,如果您请求 SYS$OUTPUT(类似于 STDOUT)的值,它将首先检查进程的逻辑表,然后是作业,然后是组,最后是整个系统的值。通过这种方式,操作系统可以在系统表中定义一个默认的 SYS$OUTPUT,但它可以被您或单个进程覆盖。

如果这看起来很复杂,它实际上是 what really happens 的简化。 .

逻辑是一个堆栈,那么如果你设置一个会发生什么?

最后,对于这个答案,$ENV{FOO} = "BAR" 将查找逻辑表堆栈并分配给它找到的第一个 FOO。如果进程表中有一个,它将分配给那个。如果作业表中有一个,它将分配给那个。依此类推,直到达到其写入权限的限制。那时它将在其最高表中创建一个新条目,可能是作业表。这意味着 $ENV{FOO} = "BAR" 很可能会出现在作业表中,从而被您的所有进程看到。

这就是在一个进程中用 Perl 设置环境变量并导出到另一个进程的方式。

https://stackoverflow.com/questions/13653779/

相关文章:

python - 在 PYTHON 中使用列表的斐波那契数列?

javascript - Laravel - 仅当屏幕尺寸 > 768px 时包含文件

php - Laravel 过滤所有列中的值

python - 在 Path 上安装 Python 3.9 时安装 Tensorflow?

python - Numpy where 和除以零

swift - 我怎样才能找到给定数字 N 中有多少个有用的数字

c++ - 如何在 C++ 中初始化返回元组的变量?

xml - TestNG XML配置文件DTD "test"标签错误

windows - "rm -rf"等同于 Windows PowerShell?

php - 在 PHP 中使用 URL 获取远程文件大小