在我们的一个模块中,我们检查给定的二进制文件 ( 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 $?'
在带有perl 5.10.1的 Debian Squeeze 或 Ubuntu Natty 下,如果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
例如文件系统差异?)。