无法从 IPC::System::Simple 向 systemx 传递命令行选项

问题描述 投票:0回答:1

我需要帮助。我正在努力将命令行选项从 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.

我一定在这里遗漏了一些明显的东西。感谢您的关注。

perl
1个回答
0
投票

您这里有多个错误:

  1. 如果你想使用像
    \t
    这样的转义序列,你必须在字符串常量周围使用双引号,就像
    "token\ttoken"
    中那样。
  2. 为什么要在分配给
    $opt
    的字符串常量的开头放置一个空格?
  3. systemx
    (和
    system
    )的用法是
    $executable, @args
    。在您的例子中,
    @args
    的第一个元素是字符串
    ' -a -f YOUR_FORMAT hostname.log'
    。由于它不是以连字符 (
    -
    ) 开头,因此命令
    gtime
    将其解释为可执行文件名称,并且该可执行文件不存在。
  4. 命令
    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";

不要忘记单引号

'
或其他一些分隔符。 额外的空格或空变量值是错误的常见来源。

© www.soinside.com 2019 - 2024. All rights reserved.