Perl中bash导出的等价物是什么?
我正在将bash脚本转换为Perl。我不确定导出的等价物是什么Perl中bash导出的等价物是什么?,perl,bash,export,Perl,Bash,Export,我正在将bash脚本转换为Perl。我不确定导出的等价物是什么 LOC=/tmp/1/ export LOC 例如,对于以上两行,等效的Perl代码是什么 my $LOC = '/tmp/1/'; # what should go here? 模块环境(参见) 的内容被传播到Perl脚本子进程的环境中。在bash中,您可能需要执行以下操作: EXPORT_CMD=/tmp/${0}_exports.bsh perl ... chmod +x $EXPORT_CMD $EXPORT_CMD r
LOC=/tmp/1/
export LOC
例如,对于以上两行,等效的Perl代码是什么
my $LOC = '/tmp/1/';
# what should go here?
模块环境(参见)
的内容被传播到Perl脚本子进程的环境中。在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变量 +1:有趣……有一个警告:看起来很难动态创建新的环境变量;该机制似乎依赖于您在编译时指定要绑定的环境变量(
use Env;
)。因此,如果您知道需要$ENV{LOC}
,那么就可以了:使用ENV qw(LOC)代码>。如果您在脚本的部分过程中决定需要一个新的env-var,那么您似乎一直在使用$env{NEWVAR}
机制,而不是模块env
。这很有趣,但我不相信它有多大用处(我自己从未使用过)。这只是意味着你可以输入$LOC
而不是$ENV{LOC}
,我想说这会让你更难看到发生了什么。(它将$PATH
视为一个Perl数组。)但不会传播到父shell(这通常是本特定FAQ中未说明的需求)在Linux中对环境的任何更改都不会传播到父shell。这是因为在Linux中,每个进程都有自己的环境。但在Windows中,只有一个环境,因此对它的任何更改都会出现在所有进程中。而对于未出生的子进程,则是如此。@shawnhcorey-我认为关于Windows的评论是不正确的。尝试setfoo=1
,perl-e'$ENV{FOO}=2
,echo%FOO%
export LOC => '/tmp/1/';