我需要帮助。我正在努力将命令行选项从 Perl 的
systemx
模块传递给 IPC::System::Simple
命令。请在下面找到我的最小示例:
#!/usr/local/bin/perl
use v5.40;
use strict;
use utf8;
use warnings;
use IPC::System::Simple qw(systemx);
# set executable name
my $exe = 'hostname';
# set GNU time command
my $time = "/opt/local/bin/gtime";
# set log file name
my $ofile = $exe . '.log';
# set GNU time command options
my $opt = ' -a -f %e\t%U\t%S\t%P\t%M\t%c\t%w\t%F\t%R -o ' . $ofile;
systemx($time, $opt, $exe);
当我拨打
systemx
而没有选择 gtime
时,效果很好:
# systemx($time, $exe);
lobachevsky
0.00user 0.00system 0:00.01elapsed 0%CPU (0avgtext+0avgdata 1152maxresident)k
0inputs+0outputs (1major+189minor)pagefaults 0swaps
当我使用
systemx
选项调用 gtime
时,我的脚本失败了:
# systemx($time, $opt, $exe);
gtime: cannot run -a -f %e\t%U\t%S\t%P\t%M\t%c\t%w\t%F\t%R -o hostname.log: No such file or directory
Command exited with non-zero status 127
0.00user 0.00system 0:00.00elapsed 50%CPU (0avgtext+0avgdata 1040maxresident)k
0inputs+0outputs (0major+83minor)pagefaults 0swaps
"/opt/local/bin/gtime" unexpectedly returned exit value 127 at ./profiler_mini.pl line 21.
我一定在这里遗漏了一些明显的东西。感谢您的关注。
您这里有多个错误:
\t
这样的转义序列,你必须在字符串常量周围使用双引号,就像"token\ttoken"
中那样。$opt
的字符串常量的开头放置一个空格?systemx
(和system
)的用法是$executable, @args
。在您的例子中, @args
的第一个元素是字符串 ' -a -f YOUR_FORMAT hostname.log'
。由于它不是以连字符 (-
) 开头,因此命令 gtime
将其解释为可执行文件名称,并且该可执行文件不存在。time/gtime
期望另一个命令作为强制参数运行。我假设您想运行命令 hostname
但您没有指定它。这会起作用:
systemx $time, '-a', '-f', "%e\t%U\t%S\t%P\t%M\t%c\t%w\t%F\t%R", '-o', 'hostname.log', 'hostname'
通过添加一些调试输出,您可能能够自己理解问题:
print "time: '$time'\n";
print "opt: '$opt'\n";
print "exe": '$exe'\n";
不要忘记单引号
'
或其他一些分隔符。 额外的空格或空变量值是错误的常见来源。