2009-07-29 43 views
2

在從子命令中導入環境時,我想將從bash腳本導出的所有環境變量添加到散列中。當program運行時,它會設置一些變量並導出它們。我想將這些變量保存在Perl腳本中以備後用。但是我不想採用子命令中定義的bash函數。目前,我有一個塊如:如何從Perl中運行子命令正確導入環境?

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

有沒有更好的方法來做到這一點?我不確定匹配initial()是否安全。在環境變量中處理換行符的獎勵點,我現在只是閉上眼睛。

+0

我不得不承認,我不知道你的問題的標題是如何與它的身體。例如,「別名」這個詞甚至沒有出現。 – innaM 2009-07-29 15:02:46

+0

回聲曼尼,你需要修復那個標題。現在,這對我沒有任何意義。 – 2009-07-29 15:14:48

回答

1

我假設program後的環境變量已執行不一樣傳遞給它(你可以在%ENV找到在jeje's answer解釋環境。

我絕不是知識淵博的有關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; 
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不會從程序中獲取環境變量。

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: [email protected]";