2011-09-06 88 views
4

我正在將bash腳本轉換爲Perl。我不確定相當於export是什麼。Perl中bash導出的等價物是什麼?

LOC=/tmp/1/ 
export LOC 

例如,對於上述兩行,等價的Perl代碼是什麼?

my $LOC = '/tmp/1/'; 
# what should go here? 

回答

8
$ENV{LOC} = "/tmp/1"; 

%ENV內容被傳播到一個Perl腳本的子進程的環境。

+6

但不是父shell(這對於這個特定的FAQ來說通常是未說明的需求) – ysth

+0

對環境的任何更改都不會傳播到Linux中的父級。這是因爲在Linux中,每個進程都有自己的環境。但在Windows中,只有一個環境,所以對其進行的任何更改都會顯示在所有進程中。 – shawnhcorey

+2

給**未出生的孩子**過程,而是。 – tchrist

4

模塊的Env(見http://perldoc.perl.org/Env.html

+1

+1:有趣的......一個警告:它看起來可能很難創建一個新的env變種;這個機制似乎依賴於你在編譯時指定要綁定的環境變量('use Env;')。所以,如果你知道你需要'$ ENV {LOC}',那麼很好:'使用Env qw(LOC);'。如果你決定通過你的腳本的一部分,你需要一個新的env var,你似乎被使用'$ ENV {NEWVAR}'機制而不是模塊'Env'卡住。 –

+0

有趣,但我不相信這是有用的(我從來沒有用過它)。它只是意味着你可以輸入'$ LOC'而不是'$ ENV {LOC}',這可以讓我們更難以看到發生了什麼。 (它把'$ PATH'當作一個Perl數組。) –

0

bash的內部,你可能想要做這樣的事情:

EXPORT_CMD=/tmp/${0}_exports.bsh 
perl ... 
chmod +x $EXPORT_CMD 
$EXPORT_CMD 
rm $EXPORT_CMD 

Perl的內部,這樣的:

sub export (@) { 
    state $exh; 
    unless ($exh) { 
     my $export_cmd_path = $ENV{EXPORT_CMD}; 
     open($exh, '>>', $export_cmd_path) 
      or die "Could not open $export_cmd_path!" 
      ; 
    } 
    while (@_ > 1) { 
     my ($name, $value) = ((uc shift), shift); 
     # If you want it visible in the current script: 
     { no strict 'refs'; 
      ${"::$name"} = $value; 
     } 
     $exh->print(qq{export $name "$value"\n}); 
    } 
} 

然後,它只是一個編碼本的問題:

export LOC => '/tmp/1/'; 

問題是,大多數程序不能更改它們被調用的shell變量。

相關問題