2012-03-08 12 views
2

私が書いたライブラリ用のテストスクリプトを作成しています。テストの一環として、$ 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変数をリセットする方がいいですか?

+0

$ ENV {PATH}は、クリア/リセットする前に設定されているものは何ですか? – vmpstr

+0

@vmpstrありがとう、あなたはこれについて私の記憶を揺さぶった。これはWindowsなので、%windir%\ system32もパスになければなりません。私はそれを加えて、それは動作します。 – Joel

答えて

2

ここでの問題は、WindowsではPATH環境変数に%windir%\ system32が必要であることです。これを追加すると、 'c:\ strawberry \ perl \ bin'が問題を解決しました。

1

「コマンド」を配列refとしてではなく文字列として送信することを選択しました。

見つからないファイルは、cmd.exeではなくperl.exeですか。

関連する問題