Perl中bash导出的等价物是什么?

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

我正在将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
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/';