进入由 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程序,用来计算一个文件中某段字符的长度有多长。