2010-08-07 31 views
6

Khi tôi echo $ PATH trên dòng lệnh của tôi, nó sẽ trả

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

Khi tôi thực thi mã php này

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

tôi nhận được

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) 

Đây là trên Mac OS X. Bất cứ ai có thể cho tôi biết lý do tại sao hai phần tử đường dẫn cuối cùng của tôi bị thiếu?

+0

Bạn đang gọi PHP trong apache hoặc trong cli – mathk

Trả lời

2

Biến môi trường trên Mac OS X được đặt theo các cơ chế khác nhau tùy thuộc vào cách mã của bạn hoặc quy trình gốc của nó đã được khởi chạy. Để đảm bảo rằng các mục được khởi chạy từ một trình bao tương tác và các mục được WindowServer đưa ra có cùng đường dẫn, bạn cần giữ ~/.MacOSX/environment.plist đồng bộ với những gì được đặt trong .profile (hoặc .cshrc).

10

Cố gắng thực hiện điều này trước khi bạn gọi exec:

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

nếu tôi sử dụng getenv ("PATH"), nó sẽ trả về đường dẫn thích hợp với việc gắn thêm nó. –

5

gì:

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

cung cấp cho bạn?

Đó có thể là vỏ mà PHP sinh sản (có thể là sh thay vì bash) không nhận được cùng một môi trường mà bạn có ở dòng lệnh. Bạn không nói cách bạn đang chạy lệnh exec của mình.

Điều này sẽ cho bạn thấy những vỏ đang được chạy:

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

Bạn có thể cần phải sử dụng lệnh putenv hoặc xác định xem đường dẫn của bạn cần phải được đặt trong /etc/profile, ~/.profile hoặc ~/.bashrc để cho nó được nhặt lên.

+0

Nó phản hồi với sh. –

+1

@Eric: Thử đặt và xuất 'ENV' trong môi trường mà bạn đang chạy tập lệnh của mình (trước khi bạn chạy tập lệnh). Ví dụ: 'export ENV =/etc/profile' hoặc' export ENV =/home/username/.profile'. (Nếu bạn sử dụng '/ .bashrc', bạn sẽ cần phải đặt mã trong đó ngăn không cho' sh' chạy mã Bash-specific mà nó không thể hiểu được.) Bourne shell chỉ tự động nguồn các tệp đó khi nó là một đăng nhập vỏ. –