PHP的exec $ PATHvariables缺less元素

当我在命令行上回显$ 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.谁能告诉我为什么我的最后两个path元素丢失?

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

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

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

什么:

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

给你?

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

这会告诉你哪个shell正在运行:

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

您可能需要使用putenv命令或确定您的path是否需要在/etc/profile~/.profile~/.bashrc中进行设置才能被拾取。