为什么我的Perl系统调用会失败?

时间:2010-03-18 11:46:04

标签: perl system

我是Perl的初学者,我在使用“系统”调用时遇到了一些麻烦。这是我尝试执行2个shell命令的一小段代码:

# First command is :
# dot -Tpng $dottmpfile > $pngfile
# Second command is :
# rm $dottmpfile

if (!($pngfile eq "")) {
  my @args = ("dot", "-Tpng", $dottmpfile, " > ", $pngfile);
  system (join (' ' , @args ))
    or die "system @args failed : $!";

  unlink $dottmpfile;
}

编辑:现在是我的代码,我仍然收到错误:

system dot -Tpng toto.dot  >  toto.png failed : Inappropriate ioctl for device at /home/claferri/bin/fractal.pl line 79.

我使用system来生成这段代码。

4 个答案:

答案 0 :(得分:3)

您正在使用>告诉shell通过使用调用system LIST将输出重定向到文件,您绕过了shell。因此,您可以使用:

system ( join (' ' , @args ) ); 

system "@args";

答案 1 :(得分:3)

查看perldoc -f system,请注意:

  

如果LIST中有多个参数,或者LIST是一个具有多个值的数组,则使用列表其余部分给出的参数启动列表第一个元素给出的程序。如果只有一个标量参数,则检查参数是否为shell元字符,如果有,则将整个参数传递给系统的命令shell进行解析

您正在调用system LIST,因此>最终会传递给dot而不是被shell解释。

我建议您继续使用system LIST因为它比通过shell传递所有内容更安全一些。根据文档,您可以使用-o的{​​{1}}选项指定输出文件,这样做。

如果你真的想点你的 i 并穿过你的 t (双关语),你可以使用:

dot

答案 2 :(得分:1)

system成功时返回0,“失败”时返回非零。这与大多数这些习语的外观和反直觉相反,但是system调用你应该使用如下表达式:

system($command) and warn "system $command: failed $?\n";   # and not or

if (system($command) != 0) { ... handle error ... }

答案 3 :(得分:-1)

PATH中的“点”可执行文件?它有可执行权限吗?您使用此代码获得了哪些具体错误?

根据perldoc -f system,这似乎是正确的。