在我的perl脚本中,我想获取环境变量到我的perl变量。我可以这样做
$no_of_lic = $ENV{`ON_OF_ENV`};
但是如果环境变量在同一个shell脚本中发生更改,那么这只是第一次有效,那么它将不会采用更新的值。
我的代码:
!/usr/local/bin/perl -w
$no_of_lic = $ARGV[0];
$ENV{'NO_OF_LIC'} = $no_of_lic;
print "No of lic to be picked : $no_of_lic\n";
print "Environment var : $ENV{NO_OF_LIC}\n";
sleep(1);
while ($no_of_lic != 0) {
sleep(1);
print "no of lic : $no_of_lic\n";
#$no_of_lic = $ENV{'NO_OF_LIC'};
sleep(10);
}
当脚本在backgorund中运行时,我将更改环境变量
setenv $NO_OF_ENV 5
一旦我这样做,我希望脚本将使用更新的值打印为5
但它没有发生..任何人都可以告诉你如何做到这一点吗?
答案 0 :(得分:12)
这不是环境变量的工作方式。
启动Perl脚本后,它将获得shell环境的克隆。之后,在Perl脚本运行时,在Perl的环境副本中将看不到对shell环境的任何更改。 (您的shell不会看到对Perl环境的任何更改。)
这不是Perl特有的 - 所有脚本语言在这方面的行为都相同。这就是Unix中如何实现环境。 (我相信Windows也会同样实现它们。)
如果需要将新数据发送到后台运行的Perl脚本,请调查诸如FIFO(a.k.a。“命名管道”)或套接字(例如TCP套接字)之类的选项。这个概念的更广泛的术语是进程间通信(IPC),perldoc的perlipc部分有更多关于该主题的信息。
答案 1 :(得分:6)
子进程将从其父进程获取所有变量的副本。稍后父进程变量的更改不会反映在其子进程中。
考虑一下:如果你改变一个进程的工作目录,它会改变所有子进程(以及他们的子进程)的工作目录,这将非常不方便(温和地说)。
答案 2 :(得分:2)
程序在启动时会获得环境。修改父(或任何其他进程)中的环境不会更新子进程的环境。如果需要与程序通信,请考虑使用文件(每次在循环中读取它)或其他一些IPC机制(套接字,数据库等)。