Perl-capture system()错误

Perl-capture system()错误,perl,Perl,我正在使用imagemagick将一些jpg图像转换为png,并在perl中具有以下内容: system("convert $jpg $png"); print "$?\n"; 是否有一种方法可以从imagemagick中捕获实际错误(而不仅仅是像我在上面的代码中所做的那样,它是否成功执行) 注意:我仅以imagemagick为例……这是一个关于如何从system()执行的任何程序中捕获错误的一般性问题 谢谢 有关最佳结果,请参见: 另请阅读上一篇: 为什么我不能得到一个 使用system(

我正在使用imagemagick将一些jpg图像转换为png,并在perl中具有以下内容:

system("convert $jpg $png");
print "$?\n";
是否有一种方法可以从imagemagick中捕获实际错误(而不仅仅是像我在上面的代码中所做的那样,它是否成功执行)

注意:我仅以imagemagick为例……这是一个关于如何从system()执行的任何程序中捕获错误的一般性问题

谢谢

有关最佳结果,请参见:

另请阅读上一篇:

为什么我不能得到一个 使用system()命令

有关最佳结果,请参见:

另请阅读上一篇:

为什么我不能得到一个 使用system()命令

从手册页抄袭:

您也可以这样使用:

use Image::Magick;

my $p = new Image::Magick;
$p->Read($jpg);
$p->Write($png);
从手册页抄袭:

您也可以这样使用:

use Image::Magick;

my $p = new Image::Magick;
$p->Read($jpg);
$p->Write($png);

正如MkV所指出的,IPC::Run是最好的解决方案。如果可能的话,使用它

如果您处于一个不允许安装CPAN模块的坏环境中,一个糟糕的解决方法是使用shell重定向进行管道攻击:

open my $fh, '-|', "convert \Q$jpg\E \Q$png\E 2>&1"
    or die "Can't launch 'convert'";

…然后根据需要读取并解析
$fh
\Q
..
\E
转义文件名,这是避免包含空格或其他shell元字符的文件名出现问题所必需的。您还应该将它们与
system()
一起使用,以避免同样的问题。

正如MkV所指出的,IPC::Run是最好的解决方案。如果可能的话,使用它

如果您处于一个不允许安装CPAN模块的坏环境中,一个糟糕的解决方法是使用shell重定向进行管道攻击:

open my $fh, '-|', "convert \Q$jpg\E \Q$png\E 2>&1"
    or die "Can't launch 'convert'";

…然后根据需要读取并解析
$fh
\Q
..
\E
转义文件名,这是避免包含空格或其他shell元字符的文件名出现问题所必需的。您还应该将它们与
system()
一起使用,以避免同样的问题。

另一方面,您应该使用system()的列表调用,这样您就不必担心引用和shell注入:“system('convert',$jpg,$png);”。胖逗号可以让一切变得更好:“system(convert=>($jpg,$png));”另一方面,您应该使用system()的list调用,这样就不必担心引用和shell注入:“system('convert',$jpg,$png);”。使用粗逗号可以使一切变得更好:“system(convert=>($jpg,$png));”你的URL需要“?”:你的URL需要“?”:
--quiet
应该是你传递给运行的数组中的另一个条目:
运行['convert','--quiet',$jpg,$png],
等等(这就是为什么胖逗号不好的原因;它们会让人误以为有神奇的语法在起作用),考虑到这不仅仅是使用shell脚本编写的。无论如何,您可以运行[convert=>-quiet=>($jpg,$png)],\$in,\$out,\$err,timeout(10)或die“$err(error$?)”,正如您所看到的,参数是-quiet not--quiet for Porculus:run['convert','-quiet',$jpg,$png],\$in,\$out,\$err,timeout(10)或die“$err(error$?”,正如您可以看到的胖逗号(=>)其工作原理类似于普通逗号,但它会导致其左操作数被解释为字符串(只要它是一个“字”,没有空格或符号,有关详细信息,请参见perlop),这有助于理解调用中参数之间的关系,如system:e.better system(cmd=>('param1','param2');而不是系统('cmd'、'param1'、'param2');
--quiet
应该只是传递给运行的数组中的另一个条目:
运行['convert','--quiet',$jpg,$png],
等等(这就是为什么胖逗号不好的原因;它们会让人误以为有神奇的语法在起作用。)我假设有一定程度的Perl知识,因为这不仅仅是使用shell脚本编写的。无论如何,您可以运行[convert=>-quiet=>($jpg,$png)],\$in,\$out,\$err,timeout(10)或die“$err(error$?)”,正如您所看到的,参数是-quiet not--quiet for Porculus:run['convert','-quiet',$jpg,$png],\$in,\$out,\$err,timeout(10)或die“$err(error$?”,正如您可以看到的胖逗号(=>)其工作原理类似于普通逗号,但它会导致其左操作数被解释为字符串(只要它是一个“字”,没有空格或符号,有关详细信息,请参见perlop),这有助于理解调用中参数之间的关系,如system:e.better system(cmd=>('param1','param2');而不是系统('cmd'、'param1'、'param2');