有几点需要经过。
首先,对于直接问题,IPC::运行3文档告诉我们
run3
如果包装则抛出异常system
回电-1
或者出了什么问题run3
文件句柄的处理。否则返回 true。它离开$?
完好无损,用于检查退出和等待状态。
您询问的错误属于此类错误,您需要eval捕获该异常的调用
use warnings 'all';
use strict;
use feature 'say';
my ($stdout, $stderr);
my @cmd = ("ls", "-l");
eval { run3 \@cmd, \undef, \$stdout, \$stderr };
if ( $@ ) { print "Error: $@"; }
elsif ( $? & 0x7F ) { say "Killed by signal ".( $? & 0x7F ); }
elsif ( $? >> 8 ) { say "Exited with error ".( $? >> 8 ); }
else { say "Completed successfully"; }
您现在可以在里面打印自己的消息if ($@) { }
块,当底层发生错误时system执行失败。例如当调用一个不存在的程序时。
Here $@
涉及到eval
while $?
to system
. So if run3
没有问题并且$@
是 false 接下来我们检查状态system
本身,因此$?
。来自文档
请注意,真实的返回值来自run3
并不意味着该命令
有成功的退出代码。因此你应该经常检查$?
.
对于变量$@
and $?
see perlvar 中的通用变量, and system
and eval
pages.
最小版本是删除eval
(and $@
检查)并期望程序die
if run3
有问题,什么应该是罕见的,并检查(并打印)的值$?
.
注释run3
界面。和\@cmd
它期望@cmd
包含分解为单词的命令,第一个元素是程序和其余参数。在字符串中写入命令之间存在差异,支持$cmd
接口,并在一个数组中。看system进行解释。
哪种选择最适合您取决于您的具体需求。这里有一些选项。也许先尝试一下IPC::系统::简单(但不是STDERR
放在盘子里)。用于干净地捕获各种输出捕获::微小是很棒的。另一端有IPC::Run为了获得更多的力量。