Получение в переменной среды perl-программы, установленной сценарием оболочки - PullRequest
0 голосов
/ 08 июля 2011

У меня есть подпрограмма perl, которую вызывает другой модуль.Существует сценарий оболочки setjavaenv.sh и пакетный скрипт setjavaenv.bat, который устанавливает переменную среды JAVA_HOME.Теперь мне нужно вызвать java-программу из моей подпрограммы, используя JAVA_HOME, установленный setjavaenv.sh.Есть ли способ сделать это без написания нового сценария shell / bat (который, возможно, печатает значение)?

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");
}

Ответы [ 2 ]

3 голосов
/ 08 июля 2011
my $javaHome = `. setjavaenv.sh; echo -n $JAVA_HOME`;
1 голос
/ 08 июля 2011

Да, вы можете использовать оператор backtick для получения окружения из подпроцесса.

#!/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"; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...