amp*_*ent 1 perl environment-variables
你可以阅读env var
$envVarVal = $ENV{'VAR_NAME'};
Run Code Online (Sandbox Code Playgroud)
反向设置不起作用,即一旦脚本运行完毕,您将看不到var:
$ENV{'VAR_NAME'} = 'some_val';
Run Code Online (Sandbox Code Playgroud)
我也尝试过系统调用:
`export VAR_NAME=some_val`;
Run Code Online (Sandbox Code Playgroud)
调用在Perl脚本中成功,但同样,变量在范围外不可见.
是否可以这样做,如果没有,为什么不能在Perl中执行它,而是通过获取常规shell脚本,任何shell,据我所知?
Sch*_*ern 13
是的,使用VMS.
这可能不是最实用的建议,但它是完整的.:)
VMS是......不同的.VMS和Unix可能与Windows和Unix有很大不同.Perl是围绕Unix思维模式构建的,必须将这些Unix概念中的一些扩展到断点,以便将它们包含在VMS的处理方式中.其中之一就是%ENV手段.
从Unix的角度来看,VMS没有环境变量.VMS最接近的是逻辑名称.它们是键/值对的表,其用途类似于环境变量和shell别名.与Unix上的环境变量不同,和Ogres一样,它们都有层.
大多数进程与至少四个逻辑名称表(进程,作业,组和系统)相关联.通常通过首先在分层序列中搜索过程,作业,组和系统表来翻译名称.高级用户可以控制搜索和翻译过程.此外,出于安全性和完整性原因,某些翻译会排除最终用户定义的逻辑名称.
在Unix上,环境表被复制到一个进程中,因此该进程不会对其父进程产生任何影响.在VMS上,逻辑表是堆栈.VMS会读取该堆栈,直到找到值.例如,如果您要求SYS$OUTPUT(例如STDOUT)的值,它将首先检查流程的逻辑表,然后检查作业,然后检查组,最后检查整个系统的值.通过这种方式,操作系统可以SYS$OUTPUT在系统表中定义默认值,但可以由您或单个进程覆盖它.
如果这看起来很复杂,它实际上是对真实情况的简化.
逻辑是一个堆栈,如果你设置一个会发生什么?
最后,到了这个答案,$ENV{FOO} = "BAR"将查找逻辑表堆栈并分配给它找到的第一个FOO.如果进程表中有一个,它将分配给它.如果作业表中有一个,它将分配给它.依此类推,直到达到其写入权限.此时,它将在其最高表(可能是作业表)中创建一个新条目.这意味着$ENV{FOO} = "BAR"很有可能落在工作表中,因此可以被所有流程看到.
这就是在一个进程中在Perl中设置环境变量并将其导出到另一个进程的方式.
这在大多数系统上是不可能的,不仅在perl中,而且在shell中也是如此.每个进程都获得自己从父进程继承的环境副本,对环境的任何更改只会影响该进程及其创建的任何子进程(在对环境进行更改之后).
$ENV{VAR_NAME} = 'some_val';在perl脚本中设置的环境变量将可用于之后由perl脚本创建的进程.就像shell脚本设置的环境变量一样,export VAR_NAME=some_val会反映在后来由该脚本创建的任何进程中.
shell 函数或使用shell脚本(使用source scriptname或. scriptname)可以对环境进行更改,该环境比函数或源脚本更长.但这是唯一可能的,因为没有创建新进程来运行该代码,它将在调用它的同一进程中运行.
使用perl的反引号运算符运行export是没有意义的.这将成功,因为这会导致perl启动一个新的shell进程,其中设置了环境变量,但是该进程将立即退出而不做任何有用的事情.
通过使用echo $$显示进程ID,您可以在某种程度上看到这一点.在运行前编写脚本,在源代码的shell脚本中运行,运行相同的脚本而不获取源代码,以及使用perl的反引号运算符执行的shell代码.也可以使用perl从perl打印进程ID print $$, "\n";.
这不可能.但是,你可以告诉Perl为你创建一个脚本然后获取它或者评估它:
#!/bin/bash
eval $(perl -e 'print "VAR1=", rand 1')
perl -e 'print "VAR2=", rand 1' > var2.sh
. var2.sh
rm var2.sh
echo $VAR1 $VAR2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |