如何在 perl 中存储模块 ava​​il 命令的输出?

How to store output of module avail command in perl?

#!/depot/local/bin/perl5.8.0
my @data = `module avail icwbev_plus `;
print "Data Array : @data \n " ;

my $data1 = `module avail icwbev_plus `;
print "Data $data1 \n" ;

my $data2 = system (" module avail icwbev_plus ");
print "S Data $data2 " 

输出:

Data Array :  
 Data  
S Data -1

我不明白为什么它不将输出存储到变量中。 请帮我解决这个问题。提前致谢。

引自documentation for system(已强调):

The return value is the exit status of the program as returned by the wait call. To get the actual exit value, shift right by eight (see below). See also exec. This is not what you want to use to capture the output from a command; for that you should use merely backticks or qx//, as described in "`STRING`" in perlop. Return value of -1 indicates a failure to start the program or an error of the wait(2) system call (inspect $! for the reason).

结合其他尝试的空白输出表明,当您尝试执行此 module 命令时,它不在您的路径中。 (我怀疑如果您遵循最佳实践并包含 use warnings;,您会在尝试打印 $data1 时得到一个关于使用未定义值的信息)


无论如何,如果这个 module 命令出现在你 运行 你的 perl 代码所在的计算机上,尝试使用它的绝对路径 (my $data1 = qx!/foo/bar/module avail icwbev_plus!),或者把它在 运行 脚本之前的路径中的目录。

module 输出到 stderr,而不是 stdout,后者未被 qx/backticks 捕获。你可以试试:

`LMOD_REDIRECT=yes module avail ...`

https://lmod.readthedocs.io/en/latest/040_FAQ.html

module 命令是一个 shell 别名或函数。因此它不能通过``或system调用直接调用。

要获得 avail 子命令的输出,您应该调用 modulecmd 命令,该命令由 module shell alias/function.

要获取 modulecmd 在您系统上的位置,请输入常规 shell 会话 type module,它会显示 module shell 调用的命令] alias/function.

然后可以通过反引号或 system 调用使用 modulecmd 命令的完全限定路径来获取 avail 子命令的结果:

要获取 module avail 命令的输出(采用简洁格式以简化解析):

#!/depot/local/bin/perl5.8.0
my $data1 = `/usr/share/Modules/libexec/modulecmd.tcl perl avail --terse icwbev_plus 2>&1`; 
print "Data $data1 \n"

请注意用于简化结果解析的 --terse 格式。 stderr 也被重定向到 stdout 以捕获命令的实际输出(因为 modulecmd 主要使用 stdout 来输出环境更改命令)。