如何在perl中获取不断变化的环境变量

时间:2013-12-13 12:31:56

标签: perl

在我的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

但它没有发生..任何人都可以告诉你如何做到这一点吗?

3 个答案:

答案 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机制(套接字,数据库等)。