我正在为我编写的库编写测试脚本,并且作为测试的一部分,我正在清除$ ENV {PATH}变量以确保我放在我的路径中的东西不会导致成功。该库将所需的路径附加到PATH变量。如果PATH env变量初始化,Perl IPC :: Cmd不运行应用程序
为了背景,我在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;
如果我运行它像这样,它打印的故障线路,如果我有两个$ENV{PATH} =
注释掉运行它,然后它打印成功行。我已经试过用第二条PATH行来改变斜杠并在最后添加斜杠,但这没有什么好处。
我已经通过调试器运行了这个,并且IPC :: Open3中的行398发生了故障: $pid = eval { system 1, @_ }; # 1 == P_NOWAIT
。如果我在此行后面检查$!
,它会告诉我'没有这样的文件或目录'。 PATH在这一点上仍然是正确的,它在任何时候都不会被修改。
另外还有一个奇怪的地方,我试过在重置PATH后使用IPC :: Cmd中的can_run
方法,它会发现没有问题的命令。
在为此提交一个错误报告之前,有没有人看过这个并知道如何解决它?另外,对于我想要做的,这是正确的方式,还是有更好的方法来重置PATH变量进行测试?
在清除/重置之前,$ ENV {PATH}设置为什么? – vmpstr 2012-03-08 16:06:04
@vmpstr谢谢你,我慢慢地记住了这一点。由于这是Windows,%windir%\ system32也必须位于路径中。我补充说,它的工作原理。 – Joel 2012-03-08 16:13:25