在我们的一个模块中,我们检查给定的二进制文件 (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
文件系统差异?)。
最佳答案
您注意到 bug fix .
在你所说的 5.10.1 版本中,open3
报告该程序运行并以代码 255 退出。这些都不是真的。
在你所说的 5.14.2 版本中,open3
抛出一个异常,因为它一直被记录在案,并且它总是对一些其他问题做。您可能会发现使用 eval BLOCK
启动子进程失败。如果需要的话。
关于perl - IPC::Open3::open3() 不适用于 perl 5.14.2 和 perl 5.10.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12072168/