我该如何在Perl中使用环境模块系统?

4

如何在Perl中使用环境模块系统*

运行:

system("load module <module>");

不起作用,可能是因为它分叉到另一个环境。


* 不要与Perl模块混淆。根据维基百科条目所述:

环境模块系统是一种工具,可帮助用户通过允许动态地设置或删除相关环境变量来管理其Unix或Linux shell环境。

3个回答

4
看起来 Perl 模块 Env::Modulecmd 可以满足你的需求。从文档中可以得知:

Env::Modulecmd 提供了一个自动化接口,可用于从 Perl 中访问 modulecmd。最直接的使用方式是在编译时加载和卸载模块,尽管还提供了许多其他用途。

示例用法:
 use Env::Modulecmd { load => 'foo/1.0' };

3

或者,为了使其更像环境模块shell而不是perl名称空间,您可以像其他shell一样source 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');"

这个问题是关于"source perl environment module"的,但这些词太过通用,几乎无法搜索到相关信息。


-1
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);
}

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