进入由 shell 脚本设置的 perl 程序环境变量

Posted

技术标签:

【中文标题】进入由 shell 脚本设置的 perl 程序环境变量【英文标题】:Getting in a perl program environment variable set by a shell script 【发布时间】:2011-07-08 05:52:12 【问题描述】:

我拥有一个其他模块调用的 perl 子例程。有一个 shell 脚本 setjavaenv.sh 和一个设置环境变量 JAVA_HOME 的批处理脚本 setjavaenv.bat。 现在我需要使用 setjavaenv.sh 设置的 JAVA_HOME 从我的子例程中调用一个 java 程序。有没有办法在不编写新的 shell/bat 脚本(可能会打印值)的情况下做到这一点?

my subroune 
 #system("setjavaenv.sh")  #Doesn't work since it probably spawns a new env.
 my $javaHome = $ENVJAVA_HOME;
 system("$javaHome/bin/java MyProgram");

【问题讨论】:

【参考方案1】:
my $javaHome = `. setjavaenv.sh; echo -n $JAVA_HOME`;

【讨论】:

谢谢。我得到了 linux/shell 的替代答案 -- system("sh -c \"source setjavaenv.sh; env;\"") 并解析它。但是,还没有蝙蝠的线索。【参考方案2】:

是的,您可以使用反引号运算符从子进程中获取环境。

#!/usr/bin/perl

sub run_with_envs 
        my %args = @_; # use a hash for function params
        my $source_envs = $argssource;
        my $cmdline = $argscommandline;
        my @varnames = @$argsenvs;

        foreach my $vname ( @varnames )
                print "## reading $vname\n";
                $ENV$vname = `source $source_envs; echo -n \$$vname`;
        

        print "## running command : $cmdline\n";
        my $rv = system($cmdline) / 256;
        return $rv; # program exited successfully if rv == 0

你可以这样称呼它:

run_with_envs( source => "envs.sh",
               commandline => "echo \$FOO" ,
               envs => [ "FOO" ] );

对于您的程序,它将是:

run_with_envs( source => "setjavaenv.sh",
               commandline => "\$JAVA_HOME/bin/java MyProgram" ,
               envs => [ "JAVA_HOME","PATH" ], );
if ( $rv != 0 ) die "program exited with state $rv"; 

【讨论】:

应使用本地 $ENV$vname = ... 而不是 $ENV$vname,否则该值也将永久设置为父进程。

以上是关于进入由 shell 脚本设置的 perl 程序环境变量的主要内容,如果未能解决你的问题,请参考以下文章

求一段perl或者shell程序,用来计算一个文件中某段字符的长度有多长。

Python ----脚本CGI特点应用开发环境

Python ----脚本CGI特点应用开发环境

Python ----脚本CGI特点应用开发环境

平时随手写的一些脚本程序:shell,perl,python

在 perl 中调试由 SWIG 包装的共享库