获取由shell脚本设置的perl程序环境变量

获取由shell脚本设置的perl程序环境变量,perl,shell,Perl,Shell,我拥有一个perl子例程,其他模块会调用它。有一个shell脚本setjavaenv.sh和一个批处理脚本setjavaenv.bat,用于设置环境变量JAVA_HOME。 现在我需要使用setjavaenv.sh设置的java_HOME从我的子例程调用一个java程序。有没有一种方法可以在不编写新的shell/bat脚本(可能会打印值)的情况下实现这一点 是的,您可以使用backtick操作符从子进程获取en环境 #!/usr/bin/perl sub run_with_envs {

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


是的,您可以使用backtick操作符从子进程获取en环境

#!/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"; }

是的,您可以使用backtick操作符从子进程获取en环境

#!/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"; }

谢谢我得到了linux/shell--system的另一个答案(“sh-c\”source setjavaenv.sh;env;\”),并对其进行了解析。不过,还没有关于蝙蝠的线索。谢谢。我得到了linux/shell--system的另一个答案(“sh-c\”source setjavaenv.sh;env;\”),并对其进行了解析。但是,还没有关于bat的线索。应该使用本地$ENV{$vname}=。。。而不是$ENV{$vname},否则也将为父进程永久设置该值。应使用本地$ENV{$vname}=。。。而不是$ENV{$vname},否则该值也将永久地为父进程设置。