我正在为我编写的库编写测试脚本,作为测试的一部分,我正在清除 $ENV{PATH} 变量以确保我放入路径中的内容不会导致成功。该库将所需的路径附加到 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;
如果我像这样运行它,它会打印失败行,如果我用两个
$ENV{PATH} =
运行它注释掉然后它打印成功行。我尝试通过更改斜杠并在末尾添加斜杠来处理第二条 PATH 行,但这没有好处。我已经通过调试器运行了这个,失败发生在 IPC::Open3 的第 398 行:
$pid = eval { system 1, @_ }; # 1 == P_NOWAIT
.如果我检查 $!
在这一行之后,它告诉我“没有这样的文件或目录”。此时 PATH 仍然设置正确,它在任何时候都没有改变。另一个奇怪的点,我试过使用
can_run
重置 PATH 后从 IPC::Cmd 调用方法,它会毫无问题地找到命令。在为此提交错误报告之前,有没有人看到过这个并知道如何修复它?另外,对于我正在尝试做的事情,这是正确的方法,还是有更好的方法来重置 PATH 变量以进行测试?
最佳答案
这里的问题是 Windows 也需要 %windir%\system32 在 PATH 环境变量中。添加这个,'c:\strawberry\perl\bin' 解决了这个问题。
关于如果 PATH 环境变量被初始化,Perl IPC::Cmd 不会运行应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9620537/