IPC::Open3::Open3()不';您不能像使用Perl5.10.1一样使用Perl5.14.2吗?

IPC::Open3::Open3()不';您不能像使用Perl5.10.1一样使用Perl5.14.2吗?,perl,ipc,ipcopen3,Perl,Ipc,Ipcopen3,在我们的一个模块中,我们检查给定的二进制(varnishd)是否存在,如果存在,我们将运行其他测试 为了执行检查,我们使用了IPC::Open3,如下所示(为了清晰起见,将示例简化): 在Debian Squence或UbuntuNatty下,使用perl 5.10.1,如果系统上找不到varnishd,这会为我打印65280。 如果将$binary更改为perl,则is(正确)打印0 $ perl -MIPC::Open3 -le ' my $binary = "perl";

在我们的一个模块中,我们检查给定的二进制(
varnishd
)是否存在,如果存在,我们将运行其他测试

为了执行检查,我们使用了
IPC::Open3
,如下所示(为了清晰起见,将示例简化):

在Debian Squence或UbuntuNatty下,使用perl 5.10.1,如果系统上找不到
varnishd
,这会为我打印
65280
。 如果将
$binary
更改为
perl
,则is(正确)打印
0

$ perl -MIPC::Open3 -le '
    my $binary = "perl";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'
0
但是,对于Ubuntu Precise和perl 5.14.2,这不再以同样的方式工作,并产生以下结果:

$ perl -MIPC::Open3 -le '
    my $binary = "varnishd";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'
open3: exec of varnishd -V failed at -e line1
当我将
$binary
更改为存在的内容时,例如
perl
,它就会正常工作并打印
0

$ perl -MIPC::Open3 -le '
    my $binary = "perl";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'
0
阅读其他问题和答案,看起来我想调查,但实际上我想:

  • 理解这种行为差异
  • 尽可能避免任何依赖关系
编辑:忘了提到这个东西是在chroot环境下运行的,包括压缩和精确系统,如果这是相关的(
/dev
文件系统差异,例如?)。

您注意到了一个问题

在您称之为5.10.1的版本中,
open3
报告程序以代码255运行并退出。这些都不是真的

在您称之为5.14.2的版本中,
open3
抛出异常,就像它一直被记录的那样,也像它一直对一些其他问题所做的那样。如果需要,您可以使用with
eval BLOCK
捕获启动子级的失败