如何在Perl脚本中重新加载Bash环境变量?

时间:2016-10-04 13:06:04

标签: bash perl

有没有办法从Perl脚本中加载Bash环境变量(通过从Bash shell中获取~/.bashrc来定义)。具体来说,我感兴趣的是在Perl脚本的调用者不是PERL5LIB进程 1 的子进程的情况下重新加载bash环境变量。在这种情况下,$ENV{PERL5LIB}将不存在,这将阻止我使用我在主目录中安装的任何模块。

首次尝试可能是使用bash选项在-l下重新运行我自己。这将加载~/.bash_profile,我已将该文件设置为加载~/.bashrc

#! /usr/bin/env perl

use strict;
use warnings;

if ( !exists $ENV{PERL5LIB} ) {    
    exec 'bash', '-lc', $0, @ARGV;
}
else {
    # Main program starts here..
}

但是这可能会导致PERL5LIB未定义~/.bashrc的(意外)情况的无限循环。

脚注:

[1]在尝试使用Google Chrome扩展程序API编写要从google-chrome进程调用的本机主机时,我遇到了这种特殊情况。 功能

2 个答案:

答案 0 :(得分:6)

Env::Modify可以从shell脚本修改您的环境。

这样的东西
use Env::Modify 'source';

# BEGIN { ???
if (!exists($ENV{PERL5LIB})) {
    source("$ENV{HOME}/.bashrc");
    die "PERL5LIB not in .bashrc" unless $ENV{PERL5LIB};
    exec($^X, $0, @ARGV);     # restart
}

答案 1 :(得分:0)

#! /usr/bin/env perl

use strict;
use warnings;

BEGIN {
    if (!exists( $ENV{PERL5LIB} )) {    
        if (!@ARGV || $ARGV[0] ne '--no-restart') {
            exec('bash', '-lc', '"$@"', $0, $^X, $0, '--no-restart', @ARGV);
        }
    }

    if (@ARGV && $ARGV[0] eq '--no-restart') {
        shift(@ARGV);
    }
}

...

(显然,使用Getopt :: Long或其他一些会更好。)

这不仅符合您的规格,还可根据需要提供旁路。

尽管如此,整个概念都存在缺陷。大多数人不应该使用PERL5LIB,而且修复配置不当的系统(那些需要PERL5LIB但不应该设置它的设置)不是你的工作。相反,fix your environment