私が書いたライブラリ用のテストスクリプトを作成しています。テストの一環として、$ ENV {PATH}変数を使用して、自分のパスに入れたものが成功をもたらさないことを確認します。ライブラリはPATH変数に必要なパスを追加します。Perl IPC :: CmdはPATH環境変数が初期化されていないとアプリケーションを実行しません
バックグラウンドでは、32ビットWindows XPでStrawberry Perl v5.12.0を実行しています。 IPC :: Cmdはバージョン0.76で、IPC :: Open3はバージョン1.05です。
私が見ているエラーは、PATH変数をクリアして設定すると、IPC :: Open3を使ってIPC :: Cmdがアプリケーションを見つけられないということです。私がこれをしなければ、うまくいくでしょう。ここでは、このエラーを示している例のスクリプトは次のとおりです。
use strict;
use warnings;
use IPC::Cmd qw(run);
$ENV{PATH} = '';
$ENV{PATH} = 'c:\\strawberry\\perl\\bin';
my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf) =
run(command => 'perl -v', verbose => 0);
if ($success) {
print 'Success: ';
print join("\n", @{$stdout_buf});
} else {
print 'Failure: ';
print join("\n", @{$full_buf});
}
exit 0;
私はこのようにそれを実行した場合、それは失敗のラインを印刷し、私がコメントアウト2 $ENV{PATH} =
でそれを実行した場合、それが成功ラインを出力します。私は、スラッシュを変更し、最後にスラッシュを追加することで、2番目のPATH行をぶち壊してみましたが、これはうまくいきません。
私はこれをデバッガで実行しました。このエラーは、IPC :: Open3の398行目で発生します。 $pid = eval { system 1, @_ }; # 1 == P_NOWAIT
です。この行の後に$!
をチェックすると「No such file or directory」と表示されます。 PATHはまだこの時点で正しく設定されていますが、どの時点でも変更されていません。
もう一つの奇妙な点は、私はPATHをリセットした後にIPC :: Cmdのcan_run
メソッドを試してみました。問題なくコマンドを見つけることができます。
これについてのバグレポートを送信する前に、これを見て誰かに修正方法を教えてもらえますか?また、私がやろうとしていることに対して、これは正しい方法ですか、あるいはテストのためにPATH変数をリセットする方がいいですか?
$ ENV {PATH}は、クリア/リセットする前に設定されているものは何ですか? – vmpstr
@vmpstrありがとう、あなたはこれについて私の記憶を揺さぶった。これはWindowsなので、%windir%\ system32もパスになければなりません。私はそれを加えて、それは動作します。 – Joel