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
, то есть (правильно) печатает 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 ответ
Вы замечаете исправление ошибки.
В том, что вы называете 5.10.1 версии, open3
сообщил, что программа запустилась и завершилась с кодом 255. Ни один из них не соответствует действительности.
В том, что вы называете версией 5.14.2, open3
выдает исключение, как это всегда было задокументировано, и как это всегда делалось для некоторых других проблем. Вы можете поймать неудачи, чтобы запустить ребенка с помощью eval BLOCK
если так хочется.