如何在 perl 中存储模块 avail 命令的输出?
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 ...`
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 来输出环境更改命令)。
#!/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 ...`
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 来输出环境更改命令)。