有没有办法从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
进程调用的本机主机时,我遇到了这种特殊情况。
功能
答案 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。