2011-09-06 36 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变量。

相关问题