2012-03-09 36 views
6

Tôi có một tập lệnh sử dụng passthru() để chạy lệnh. Tôi cần phải thiết lập một số biến môi trường shell trước khi chạy lệnh này, nếu không nó sẽ không tìm thấy thư viện của nó.biến môi trường shell xuất trước khi chạy lệnh từ tập lệnh PHP CLI

Tôi đã thử những điều sau đây:

putenv("LD_LIBRARY_PATH=/path/to/lib"); 
passthru($cmd); 

Sử dụng putenv() không xuất hiện để tuyên truyền cho lệnh Tôi đang chạy. Nó không nói rằng nó không thể tìm thấy nó thư viện. Khi tôi chạy export LD_LIBRARY_PATH=/path/to/lib trong bash, nó hoạt động tốt.

Tôi cũng đã cố gắng như sau (trong vô vọng):

exec("export LD_LIBRARY_PATH=/path/to/lib"); 
passthru($cmd); 

Làm thế nào tôi có thể thiết lập một biến vỏ từ PHP, mà truyền cho tiến trình con của kịch bản PHP của tôi?

Tôi có bị hạn chế kiểm tra xem biến không tồn tại trong môi trường hiện tại và yêu cầu người dùng đặt thủ công không?

+0

thể trùng lặp của http://stackoverflow.com/questions/2002970/export-a-variable-from-php-to-shell – Electronick

+0

Tôi đã đọc câu hỏi đó, điều này có vẻ giống nhau nhưng nếu bạn đọc nó , Tôi hỏi làm thế nào để đạt được một cái gì đó khác nhau. –

Trả lời

5

Tôi không phải 100% quen thuộc với cách thức hoạt động exec PHP, nhưng bạn đã thử: exec("LD_LIBRARY_PATH=/path/to/lib $cmd")

Tôi biết rằng điều này làm việc trong hầu hết các vỏ nhưng tôi không chắc chắn như thế nào PHP làm việc.

EDIT: Giả sử này đang làm việc, để đối phó với nhiều biến chỉ tách chúng bằng một không gian:

exec("VAR1=val1 VAR2=val2 LD_LIBRARY_PATH=/path/to/lib $cmd")

+0

Và nếu tôi có nhiều hơn một biến? 'MYVAR = giá trị; LD_LIBRARY_PATH =/path/to/lib $ cmd'? –

+1

không có dấu chấm phẩy, chỉ cần một không gian – klaustopher

+0

dường như, ít nhất theo liên kết ubuntu tôi đăng, mặc dù tôi chưa bao giờ làm điều đó – dldnh

1

Một vài điều tôi suy nghĩ. Một là cho $ cmd là một kịch bản bao gồm thiết lập biến môi trường trước khi chạy chương trình thực tế.

Một suy nghĩ là thế này: Tôi biết bạn có thể định nghĩa một biến và chạy một chương trình trên cùng một dòng, chẳng hạn như:

DISPLAY=host:0.0 xclock 

nhưng tôi không biết nếu đó là công việc trong bối cảnh passthru

https://help.ubuntu.com/community/EnvironmentVariables#Bash.27s_quick_assignment_and_inheritance_trick

+0

$ cmd thực sự là một lệnh để chạy tệp xây dựng kiến, kịch bản lệnh này kết thúc tốt đẹp việc xây dựng lệnh đó. –

2

Bạn chỉ có thể thêm phân bổ biến của mình vào $ cmd.

[[email protected] ~]$ cat doit.php 
<?php 

$cmd='echo "output=$FOO/$BAR"'; 

$cmd="FOO=bar;BAR=baz;" . $cmd; 

print ">> $cmd\n"; 
passthru($cmd); 

[[email protected] ~]$ php doit.php 
>> FOO=bar;BAR=baz;echo "output=$FOO/$BAR" 
output=bar/baz 
[[email protected] ~]$ 
Các vấn đề liên quan