2013-12-13 40 views
1

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

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

+6

程序在开始时给予它们的环境。修改父级(或任何其他进程)中的环境不会更新子进程的环境。如果您需要与程序进行通信,请考虑使用文件(每次在循环中读取它)或其他IPC机制(套接字,数据库等)。 –

+0

@KyleBurton:请把它作为答案。 – Borodin

+0

完成,但已有其他答案...谢谢@Borodin –

回答

12

这不是环境变量的工作方式。

当你的Perl脚本启动时,它会得到shell环境的克隆。之后,当Perl脚本运行时,对shell环境的任何更改都不会在Perl的环境副本中看到。 (并且您的Perl环境的任何更改都不会被您的shell看到)。

这不是特定于Perl的 - 所有脚本语言在这方面的行为都是相同的。这只是在Unix中如何实现环境。 (并且我相信Windows以类似的方式实现它们。)

如果您需要将新数据发送到在后台运行的Perl脚本,请调查诸如FIFO(又名“命名管道”)或套接字(例如TCP插座)。这个概念的更广泛的术语是进程间通信(IPC),perldoc的perlipc部分有更多关于该主题的信息。

+0

感谢tobyink ..你有没有任何例子通过IPC – user3099290

6

子进程将从其父进程获得所有变量的副本。父进程变量的后期更改不会反映在其子进程中。想想看吧:如果你改变一个进程的工作目录,并且它会改变其所有子进程的工作目录(反过来他们的子进程),这会非常不方便。

2

当程序启动时会为其提供环境。修改父级(或任何其他进程)中的环境不会更新子进程的环境。如果您需要与程序进行通信,请考虑使用文件(每次在循环中读取它)或其他IPC机制(套接字,数据库等)。

+0

解决这个问题你可以详细说明我可以如何使用IPC? – user3099290