【问题标题】:Perl ENV hash not populated when calling script using env -i使用 env -i 调用脚本时未填充 Perl ENV 哈希
【发布时间】:2014-03-19 20:31:38
【问题描述】:

我有一个需要从干净的环境中调用的 Perl 脚本。我调用脚本的方式如下。

env -i test.pl

调用env -i 后,某些环境变量保持不变,例如PATH。但是,根据ENV 哈希,PATH 变量是空的。

这里是脚本(删节):

#!/usr/bin/perl -w

system('echo "system: $PATH"');
print "perl hash: $ENV{'PATH'}\n";

这是我运行env -i test.pl时的输出:

system: /usr/local/bin:/bin:/usr/bin
Use of uninitialized value in concatenation (.) or string at test.pl line 4.
perl hash:

当我在env -i 下调用脚本时,如何使ENV 哈希正确?

【问题讨论】:

  • 根据我的 CentOS 系统的手册页,-i 选项清除环境。
  • -i, --ignore-environment 以空环境开始
  • @RonBergin:是的,这就是我们的意图,从一个干净的环境开始。然而env -i 并没有将环境完全 留空——它使用一些基本条目重新填充PATH,这由系统调用演示。我想知道如何让 Perl ENV 哈希识别这一点。

标签: perl environment-variables


【解决方案1】:

env-i 选项实际上确实将$PATH 清除出环境。您看到system 调用结果不一致的原因是system works

如果只有一个标量参数,则检查该参数 shell 元字符,如果有的话,整个参数是 传递给系统的命令外壳进行解析(这是 /bin/sh -c 在 Unix 平台上,但在其他平台上有所不同)。如果没有 参数中的 shell 元字符,它被分成单词和 直接传给 execvp ,效率更高。

因为您使用必须由 shell 解析的单个命令行调用 system,所以会启动一个,它会在启动时初始化自己的 $PATH(因为 shell 会这样做),这就是您所看到的.

【讨论】:

  • 啊,我明白了。我离开了this answer 中的第一条评论,但不同之处在于(s)他在env -i 下运行一个bash 脚本,它启动了自己的shell。感谢您为我解决这个问题。
【解决方案2】:

调用 env -i 后,某些环境变量保持不变,例如 PATH。但是,根据 ENV 哈希,PATH 变量是空的。

在我的 rhel 系统上,env -i 会:

    -i, --ignore-environment
          start with an empty environment

因此,当您运行 Perl 程序时,system() 调用正在分叉一个 shell,它可能正在读取一个设置 PATH 的 rc 文件。但是当你直接从 Perl 程序打印 $ENV{PATH} 时,它是空的。

您应该手动设置 PATH,或者确定要运行的各种可执行文件的完整路径。

如果您要花费大量时间运行 system() 命令,那么在这种情况下,使用一些 Perl 来处理中间结果的 shell 脚本可能是更好的处理模型。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2012-10-07
    • 2019-09-09
    • 2022-04-07
    • 1970-01-01
    • 2012-06-12
    • 2021-04-29
    • 2015-06-27
    • 2023-03-25
    相关资源
    最近更新 更多