如何在Perl中使用Environment Modules系统 * ?
运行
system("load module <module>");
不起作用,大概是因为它要求转移到另一个环境。
*不要与Perl模块混淆。根据{{3}}:
环境模块系统是一种帮助用户管理其Unix或Linux shell环境的工具,允许动态制作或删除相关环境变量设置组。
答案 0 :(得分:4)
看起来Perl模块Env::Modulecmd
会做你想要的。来自文档:
Env::Modulecmd
为Perl的modulecmd
提供了一个自动界面。Env::Modulecmd
最直接的用法是在编译时加载和卸载模块,尽管提供了许多其他用途。
使用示例:
use Env::Modulecmd { load => 'foo/1.0' };
答案 1 :(得分:3)
或者,为了减少perl-namespace和更多类似于shell的环境模块,你可以像其他shell一样获取Environment Modules初始化perl代码:
do( '/usr/share/Modules/init/perl');
module('load use.own');
print module('list');
对于单行示例:
perl -e "do ('/usr/share/Modules/init/perl');print module('list');"
(这个问题,&#34; source perl环境模块&#34;使用这样的通用词,它几乎是无法搜索的。)
答案 2 :(得分:0)
system("load module foo ; foo bar");
或者,如果那不起作用,那么
system("load module foo\nfoo bar");
我猜它会改变环境变量。要更改Perl的环境变量,必须在Perl进程中执行。这不会起作用,因为它肯定只是设计为集成到shell中。 (但是移植它可能并不太难。)
如果您在加载模块后重启脚本没问题,可以使用以下解决方法:
use String::ShellQuote qw( shell_quote );
BEGIN {
if (!@ARGV || $ARGV[0] ne '!!foo_loaded!!') {
my $perl_cmd = shell_quote($^X, '--', $0, '!!foo_loaded!!', @ARGV);
exec("load module foo ; $perl_cmd")
or die $!;
}
shift(@ARGV);
}