与perl 5.10.1一样,IPC :: Open3 :: open3()不能与perl 5.14.2一起使用吗?

时间:2012-08-22 11:33:46

标签: perl ipc ipcopen3

在我们的一个模块中,我们检查给定的二进制文件(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,则(正确)打印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

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

  • 了解这种行为差异
  • 避免任何依赖,如果可能的话
编辑:忘记提及这些东西是在 chroot 环境下运行的,包括Squeeze和Precise系统,如果这些都是相关的(/dev文件系统差异,例如?)。

1 个答案:

答案 0 :(得分:10)

您注意到bug fix

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

在你所谓的5.14.2版本中,open3抛出一个异常,因为它总是被记录下来,并且它总是为其他一些问题做了。如果需要,您可能会发现使用eval BLOCK启动孩子的失败。