【问题标题】:PHP exec $PATH variable missing elementsPHP exec $PATH 变量缺少元素
【发布时间】:2011-03-26 14:41:48
【问题描述】:

当我在命令行上回显 $PATH 时,它会返回

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Applications/MAMP/Library/bin:/usr/local/git/bin:/usr/X11/bin

当我执行这个 php 代码时

exec('echo $PATH; whoami; less /etc/paths; 2>&1')

我明白了

string 'echo $PATH; whoami; less /etc/paths; 2>&1' (length=56)
array
  0 => string '/usr/bin:/bin:/usr/sbin:/sbin' (length=29)
  1 => string 'eric' (length=4)
  2 => string '/usr/bin' (length=8)
  3 => string '/bin' (length=4)
  4 => string '/usr/sbin' (length=9)
  5 => string '/sbin' (length=5)
  6 => string '/usr/local/bin' (length=14)
  7 => string '/Applications/MAMP/Library/bin' (length=30)
  8 => string '/usr/bin:/bin:/usr/sbin:/sbin' (length=29)

这是在 Mac OS X 上。谁能告诉我为什么我的最后两个路径元素丢失了?

【问题讨论】:

  • 你是在apache还是在cli中调用PHP

标签: php bash path environment-variables exec


【解决方案1】:

在调用 exec 之前尝试执行此操作:

putenv("PATH=" .$_ENV["PATH"]. ':/usr/local/git/bin:/usr/X11/bin');

【讨论】:

  • 如果我使用 getenv("PATH"),它会返回正确的路径并附加它。
  • 比如我只需要做putenv("PATH=" . getenv('PATH'));
【解决方案2】:

做什么:

php -r 'print getenv("PATH");'

给你?

很可能 PHP 生成的 shell(可能是 sh 而不是 bash)没有获得与命令行相同的环境。你没有说你是如何运行你的exec 命令的。

这将显示正在运行的 shell:

php -r 'echo shell_exec("echo $0");'

您可能需要使用putenv 命令或确定您的路径是否需要设置为/etc/profile~/.profile~/.bashrc 才能被拾取。

【讨论】:

  • @Eric:尝试在运行脚本的环境中设置和导出ENV(在运行之前)。例如:export ENV=/etc/profileexport ENV=/home/username/.profile。 (如果您使用/.bashrc,则需要在其中添加代码以防止sh 运行它无法理解的特定于Bash 的代码。)Bourne shell 仅在它是登录shell 时自动获取这些文件。
【解决方案3】:

Mac OS X 上的环境变量由不同的机制设置,具体取决于您的代码或其父进程的启动方式。为了确保从交互式 shell 启动的项目和 WindowServer 启动的项目具有相同的路径,您需要使 ~/.MacOSX/environment.plist 与 .profile(或 .cshrc)中设置的内容保持同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2012-04-24
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多