在Perl中,bash export的等效方法是什么?

4

我正在将一个bash脚本转换成Perl。我不确定export的等效语是什么。

LOC=/tmp/1/
export LOC

例如,对于上面的两行代码,等价的Perl代码是什么?
my $LOC = '/tmp/1/';
# what should go here?
3个回答

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

%ENV的内容会传递给Perl脚本子进程的环境变量。


6
但不要返回到父Shell(这通常是此特定FAQ中未明示的需求)。 - ysth
在Linux中,对环境所做的任何更改都不会传播到父级,这是因为在Linux中,每个进程都有自己的环境。但在Windows中,只有一个环境,因此对其进行的任何更改都会出现在所有进程中。 - shawnhcorey
2
对于未出生的子进程,而不是。 - tchrist
@shawnhcorey - 我不认为关于Windows的评论是正确的。尝试使用set FOO=1perl -e '$ENV{FOO}=2echo %FOO% - mob

4

1
+1:很有趣......一个警告:似乎很难在运行时创建新的环境变量;该机制似乎依赖于您在编译时指定要绑定的环境变量(use Env;)。因此,如果您知道需要 $ENV{LOC},那么没问题:use Env qw(LOC);。如果您在脚本执行过程中决定需要一个新的环境变量,则似乎只能使用 $ENV{NEWVAR} 机制而不是模块 Env - Jonathan Leffler
有趣,但我并不认为它非常有用(我自己从未使用过)。这只是意味着你可以输入$LOC而不是$ENV{LOC},我认为这只会让事情变得更加难以理解。(而且它将$PATH视为Perl数组。) - Keith Thompson

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 变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接