PHP exec $ PATH переменная отсутствует элементы - PullRequest
6 голосов
/ 07 августа 2010

Когда я повторяю $ 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. Может кто-нибудь сказать мне, почему мои последние два элемента пути отсутствуют?

Ответы [ 3 ]

11 голосов
/ 07 августа 2010

Попробуйте выполнить это перед вызовом exec:

putenv("PATH=" .$_ENV["PATH"]. ':/usr/local/git/bin:/usr/X11/bin');
6 голосов
/ 07 августа 2010

Что:

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

дает вам?

Вероятно, оболочка, которую порождает PHP (вероятно, sh вместо bash), не получает ту же среду, в которойу вас в командной строке.Вы не говорите, как выполняете команду exec.

Это покажет вам, какая оболочка запущена:

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

Возможно, вам придется использовать команду putenv или определить, нужно ли задавать путь в /etc/profile, ~/.profile или ~/.bashrc для того, чтобы его забрали.

2 голосов
/ 21 сентября 2010

Переменные среды в Mac OS X устанавливаются различными механизмами в зависимости от того, как был запущен ваш код или его родительский процесс. Чтобы гарантировать, что элементы, запускаемые из интерактивной оболочки, и элементы, запускаемые WindowServer, имеют одинаковый путь, необходимо синхронизировать ~ / .MacOSX / environment.plist с тем, что установлено в .profile (или .cshrc).

...