2010-08-07 32 views
6

当我赞同我的命令行$ 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.谁能告诉我为什么我的最后两个路径元素丢失?

+0

如果我使用getenv(“PATH”),你在apache或cli – mathk 2010-08-07 11:58:38

回答

2

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

10

尝试执行此调用exec前:

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

中调用PHP,它会返回正确的路径并附加它。 – 2010-08-08 18:19:27

5

是什么:

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

给你?

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

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

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

您可能需要使用putenv命令或决定是否需要在/etc/profile~/.profile~/.bashrc按顺序设置为它是您的路径已接。

+0

它回应sh。 – 2010-08-08 18:17:10

+1

@Eric:尝试在运行脚本的环境中(运行之前)设置并导出ENV。例如:'export ENV =/etc/profile'或'export ENV =/home/username/.profile'。 (如果使用'/ .bashrc',则需要在其中放置代码以防止'sh'运行它无法理解的特定于Bash的代码。)Bourne shell仅在登录时自动生成这些文件贝壳。 – 2010-08-08 18:45:16