我是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来生成这段代码。
答案 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,这似乎是正确的。