+ -
当前位置:首页 → 问答吧 → 请教一个关于UNIX下perl调用脚本设置环境的问题

请教一个关于UNIX下perl调用脚本设置环境的问题

时间:2010-09-09

来源:互联网

有一个UNIX下的perl脚本
------------------------------------------------------------------
        #!/opt/exp/bin/perl
       
        unless ( defined $ENV{ENV_VAL}) {
                print " Setting the ENV\n";
                system(". set_env");
                &print_env;
        } else {
                &print_env;
        }
       
        sub print_env{
                print " env value is $ENV{ENV_VAL}\n";
        }
------------------------------------------------------------------
其中调用了set_env。


set_env的内容是
------------------------------------------------------------------
        ENV_VAL=8
------------------------------------------------------------------

perl  脚本执行的结果是

1.        (ENV_VAL 没有设置时)
Setting the ENV
env value is


2.        (ENV_VAL 设置为2010时)
env value is 2010

请高人指点为什么会出现第一种运行结果,我期望的运行结果是打印出“env value is 8”。怎么改这个perl脚本才能达到这种效果。

谢谢。

作者: elfzhuyun   发布时间: 2010-09-09

本帖最后由 Perl_Er 于 2010-09-09 15:21 编辑

回复 elfzhuyun


                    system(". set_env"); 在shell 里source进来里面可以,perl不行.  另外system运行的命令是在子shell里面
                    直接赋值:$ENV{ENV_VAL} = 8

作者: Perl_Er   发布时间: 2010-09-09

本帖最后由 elfzhuyun 于 2010-09-09 15:24 编辑

回复 Perl_Er


这个我知道,我的例子是简单的set_env脚本,这是一个例子,真实的情况是,set_env脚本可能很大,很复杂,也有可能是其他脚本语言写的,不可能在perl脚本中重写的。

另外,我发现不调用sub,而是将sub的内容直接写在外边也是可行的,运行效果也是我期待的,但是坏处是要重复写两遍,不利于代码维护。


还请大虾赐教。

作者: elfzhuyun   发布时间: 2010-09-09

回复 elfzhuyun


    你写在外面都可以?

作者: Perl_Er   发布时间: 2010-09-09

回复 Perl_Er


可以的。实际的代码是


...

my $output_file = "xxxxxxxx.txt";
...

&get_some_infomation;

sub     get_some_infomation {
        #
        #       Set the ENV
        #
        print "\n Setting the ENV, please wait ... \n\n";
        system(" . a_command_to_run ");
        system(" echo > $output_file");
      
        #
        #       Get the information
        #
        print "\n Get the infomation\n";
        system ( "b_command_to_run  >> $output_file");
        
        ...
}

...   


(b_command_to_run 需要a_command_to_run设置环境)
问题是a_command_to_run运行时间长,我想在环境设置好的前提下,跳过运行a_command_to_run。

作者: elfzhuyun   发布时间: 2010-09-09

回复 elfzhuyun


不好意思,这样写还是不行。

我之所以有错觉是因为运行perl脚本之前我运行过设置环境的脚本了。

还是一楼的问题,怎么样在perl脚本中,想k shell一样用".  _command_"方式改变脚本的环境。

谢谢大虾了。

作者: elfzhuyun   发布时间: 2010-09-09

setenv文件中文件中只有ENV_VAL=8这一句吗?

作者: yybmsrs   发布时间: 2010-09-09

回复 yybmsrs


   

wc -l bin/setenv
    3125 bin/setenv

实际的setenv上千行,当然里边有注释行,它是其他人管理维护的。所以我的perl只能调用它,或者强制用户先运行setenv脚本,在运行本perl工具。

作者: elfzhuyun   发布时间: 2010-09-09

本帖最后由 Perl_Er 于 2010-09-09 16:58 编辑

回复 elfzhuyun


    你这样在perl里面是得不到那个环境变量的. 除非你在运行这个perl之前先运行那个shell(而且变量必须是export了的). 因为你用system调用执行实在子进程里面,子进程不会影响父进程

作者: Perl_Er   发布时间: 2010-09-09