如何使用环境模块系统*在 Perl 中
跑步
system("load module <module>");
不起作用,大概是因为它分叉到另一个环境。
* 不要与 Perl 模块混淆。根据维基百科条目:
Environment Modules 系统是一个帮助用户管理他们的 Unix 或 Linux shell 环境的工具,它允许动态地创建或删除相关的环境变量设置组。
看起来 Perl 模块Env::Modulecmd
会做你想做的事。从文档中:
Env::Modulecmd
提供了一个modulecmd
从 Perl 的自动化接口。最直接的用途Env::Modulecmd
是在编译时加载和卸载模块,尽管提供了许多其他用途。
示例用法:
use Env::Modulecmd { load => 'foo/1.0' };
或者,要减少 perl 命名空间,而更多地使用环境模块 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');"
(这个问题,“源 perl 环境模块”使用了这样的通用词,几乎无法搜索。)
system("load module foo ; foo bar");
或者,如果这不起作用,那么
system("load module foo\nfoo bar");
我猜它会改变环境变量。要更改 Perl 的环境变量,必须在 Perl 进程中执行。那是行不通的,因为它肯定只是设计用于集成到外壳中。(不过,移植它可能并不难。)
如果您可以在加载模块后重新启动脚本,您可以使用以下解决方法:
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);
}