4

モジュールの 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 $?'

Perl 5.10.1を使用した Debian Squeeze または Ubuntu Natty ではvarnishd、システムに が見つからない場合、これが表示65280されます。を に変更する$binaryperl、(正しく) が出力され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ファイルシステムの違いなど)。

4

1 に答える 1

10

あなたはバグ 修正に気づいています。

あなたが 5.10.1 バージョンと呼んでいるものopen3では、プログラムが実行され、コード 255 で終了したことが報告されました。どちらも真実ではありません。

5.14.2 バージョンと呼ばれるものでopen3は、例外がスローされます。これは、常に文書化されており、他の問題に対して常に行われているためです。必要に応じて with を使用して、子の起動の失敗をキャッチすることができeval BLOCKます。

于 2012-08-22T12:41:46.573 に答える