2010-08-07 9 views
6

Quand j'echo $ PATH sur ma ligne de commande, il renvoie

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

Lorsque j'exécute ce code php

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

Je reçois

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) 

Ceci est sur Mac OS X. Quelqu'un peut-il me dire pourquoi mes deux derniers éléments de chemin sont manquants?

+0

Appelez-vous PHP dans apache ou dans cli – mathk

Répondre

2

Les variables d'environnement sur Mac OS X sont définies par des mécanismes différents en fonction du lancement de votre code ou de son processus parent. Pour vous assurer que les éléments lancés à partir d'un shell interactif et les éléments lancés par WindowServer ont le même chemin, vous devez synchroniser ~/.MacOSX/environment.plist avec ce qui est défini dans .profile (ou .cshrc).

10

Essayez d'exécuter cette avant d'appeler exec:

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

si j'utilise getenv ("PATH"), il retourne le bon chemin avec mon ajout. –

5

Qu'est-:

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

vous donner?

Il est probable que le shell PHP fraie (probablement sh au lieu de bash) ne reçoit pas le même environnement que vous avez à la ligne de commande. Vous ne dites pas comment vous exécutez votre commande exec.

Cela vous montrera quel shell est en cours d'exécution:

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

Vous devrez peut-être utiliser la commande putenv ou déterminer si votre chemin doit être défini dans /etc/profile, ~/.profile ou ~/.bashrc afin qu'il soit ramassé.

+0

Il a répondu avec sh. –

+1

@Eric: Essayez de définir et d'exporter 'ENV' dans l'environnement dans lequel vous exécutez votre script (avant de l'exécuter). Par exemple: 'export ENV =/etc/profile' ou' export ENV =/home/nom d'utilisateur/.profile'. (Si vous utilisez '/ .bashrc', vous devrez y ajouter du code qui empêche' sh' d'exécuter du code spécifique à Bash qu'il ne peut pas comprendre.) Le shell Bourne ne fait que rechercher ces fichiers automatiquement lorsqu'il s'agit d'un login coquille. –