2

在从子命令导入环境时,我想将从 bash 脚本导出的所有环境变量添加到哈希中。运行时program,它会设置一些变量并导出它们。我想将这些变量保存在 Perl 脚本中以备后用。但是我不想使用子命令中定义的 bash 函数。目前,我有一个像这样的块:

foreach (`program; env`)
{
    next if /^\(\)/;
    my ($a, $b) = split("=", $_);
    if( /^(\w+)=(.*)$/ ) {
        $hash{$1} = $2;    
    }
}

有一个更好的方法吗?我不确定匹配初始 () 是否安全。处理环境变量中的换行符的奖励积分,我现在只是闭上眼睛。

4

3 回答 3

5

你想要的是: Shell-EnvImporter

一个例子:

  use Shell::EnvImporter;

  # Import environment variables exported from a shell script
  my $sourcer  = Shell::EnvImporter->new(
                   file => $filename,
                 );


  my $result = $sourcer->run() or die "Run failed: $@";
于 2009-07-29T15:33:52.670 回答
1

我假设program执行后的环境变量与传递给它的环境不同(您可以在jeje's answer%ENV中找到解释。

我对 bash 一无所知,所以我只会解决关于解析env.

#!/usr/bin/perl

use strict;
use warnings;

use autodie qw( open close );

$ENV{WACKO} = "test\nstring\nwith\nnewlines\n\n";

my %SUBENV;

open my $env_h, '-|', 'env';

my $var;

while ( my $line = <$env_h> ) {
    chomp $line;
    if ( my ($this_var, $this_val) = $line =~ /^([^=]+)=(.+)$/ ) {
        if ( $this_val =~ /^\Q()\E/ ) {
            $var = q{};
            next;
        }
        $var = $this_var;
        $SUBENV{ $var } = $this_val;
    }
    elsif ( $var ) {
        $SUBENV{ $var } .= "\n$line";
    }
}

use Data::Dumper;
print Dumper \%SUBENV;
于 2009-07-29T15:13:31.290 回答
0

这对于获取所有环境变量应该没问题。

for(`program; env`){
  if( /^([^=]+)=(.*)$/ ) {
    $hash{$1} = $2;    
  }
}

如果您想从头开始,这可能会更好。

for(`env -i bash -c "program; env"`){
  next if /\(\)/;
  if( /^([^=]+)=(.*)$/ ) {
    $hash{$1} = $2;    
  }
}

env -i使它的子命令从头开始。

-c它使用参数和要运行的命令调用 bash 。我们需要这样做,否则第二个env将无法从程序中获取环境变量。

于 2009-07-29T15:23:05.950 回答