如果 PATH 环境变量被初始化,Perl IPC::Cmd 不会运行应用程序

标签 perl

我正在为我编写的库编写测试脚本,作为测试的一部分,我正在清除 $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/

相关文章:

Perl DBD::CSV - SQL 语法 - "AND"子句无法正常工作

perl - 如何检查 perl 程序上次运行的时间?

linux - 解码 Perl 脚本

linux - 需要更好的数字组合解决方案

perl - 使用 perl 从 http 帖子中获取/转储所有信息

Perl 尽可能干净地调用具有显式附加范围的子例程引用

perl - Perl 5 中的父级和基级有什么区别?

perl - 在 Perl 中有多少种方法可以调用一个子程序而忽略它的原型(prototype)?

perl - 在单独的 git 存储库中维护/测试(moSTLy Perl)软件且它们之间存在依赖关系的最佳实践是什么?

perl - WWW::Mechanize ssl 跨站点登录失败 cookie_jar 未填充