2011-07-08 12 views
0

私は他のモジュールが呼び出すperlサブルーチンを所有しています。環境変数JAVA_HOMEを設定するシェルスクリプトsetjavaenv.shとバッチスクリプトsetjavaenv.batがあります。 setjavaenv.shで設定されたJAVA_HOMEを使用して、サブルーチンからJavaプログラムを呼び出す必要があります。新しいシェル/バットスクリプト(おそらく値を表示する)を書かずにこれを行う方法はありますか?シェルスクリプトで設定したperlプログラム環境変数を取得する

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

答えて

3
my $javaHome = `. setjavaenv.sh; echo -n $JAVA_HOME`; 
+1

感謝。私はlinux/shell - system( "sh -c \" source setjavaenv.sh; env; \ "")の代わりに答えを得てそれを解析します。しかし、まだバットのための手掛かりはありません。 –

1

はい、あなたは、サブプロセスから環境エン取得するためにバックティック演算子を使用することができます。

#!/usr/bin/perl 

sub run_with_envs { 
     my %args = @_; # use a hash for function params 
     my $source_envs = $args{source}; 
     my $cmdline = $args{commandline}; 
     my @varnames = @{$args{envs}}; 

     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"; } 
+1

$ ENV {$ vname} = ...ではなく、$ ENV {$ vname} =を使用する必要があります。それ以外の場合、値は親プロセスに対しても永久に設定されます。 –

関連する問題