0
#!/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

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

4

3 回答 3

1

文档中system引用(强调添加):

返回值是等待调用返回的程序的退出状态。要获得实际的退出值,请右移八位(见下文)。另请参见执行。这不是您想要用来捕获命令输出的内容;为此,您应该只使用反引号或 qx//,如 perlop 中的“`STRING`”中所述。返回值 -1 表示启动程序失败或 wait(2) 系统调用出错(检查 $! 原因)。

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


无论如何,如果module您正在运行 perl 代码的计算机上存在此命令,请尝试使用它的绝对路径 ( my $data1 = qx!/foo/bar/module avail icwbev_plus!),或者在运行脚本之前将其所在的目录放在您的路径中。

于 2019-08-16T11:22:54.130 回答
0

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

`LMOD_REDIRECT=yes module avail ...`

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

于 2019-08-16T17:41:17.477 回答
0

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

要获取avail 子命令的输出,您应该调用modulecmdmoduleshell 别名/函数调用的命令。

要在您的系统上获取 的位置,modulecmd请输入一个常规的 shell 会话,该会话type module公开由moduleshell 别名/函数调用的命令。

modulecmd然后可以通过反引号或调用使用命令的完全限定路径来system获取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 来输出环境更改命令)。

于 2019-08-16T17:55:30.757 回答