IPC::Open3::open3() 不适用于 perl 5.14.2,就像 perl 5.10.1 一样?



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

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

perl -MIPC::Open3 -le '
    my $binary = "varnishd";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'

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

然而,对于UbuntuPrecise和perl5.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

阅读其他问题和答案,看起来我想研究IPC::Run,但实际上我想:

  • 理解这种行为差异
  • 尽可能避免更多依赖项

EDIT:忘了提一下,这些东西是在chroot环境下运行的,包括Squeeze和Precise系统,如果这一切都相关的话(例如,/dev文件系统的差异?)。

您注意到了一个错误修复。

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

在您称之为5.14.2的版本中,open3抛出了一个异常,正如它一直以来所做的那样,以及它对其他一些问题所做的一样。如果需要,您可能会发现使用eval BLOCK启动子项失败。

相关内容

最新更新