2010-01-04 38 views
5

Tôi đang cố đặt một biến có thể truy cập được từ bên ngoài PHP. Lý tưởng nhất là một biến cục bộ, nhưng các biến môi trường cũng được chào đón.Xuất biến từ PHP sang shell

Trước tiên, tôi đã cố gắng putenv(), nhưng điều này không đưa ra kết quả:

$ php -r "putenv ('PHP_TEST = string');" ; echo $ PHP_TEST

$

Khi tôi gọi getenv() từ kịch bản tương tự - nó kết quả trong 'chuỗi' giá trị đúng. chế độ an toàn tắt, nhưng hướng dẫn nói tiền tố 'PHP_' là quan trọng với an toàn = on vì vậy tôi sử dụng nó chỉ trong trường hợp :)

Sau đó, tôi cố gắng system() hoặc shell_exec():

$ php -r "shell_exec ('PHP_TEST = chuỗi');" ; echo $ PHP_TEST

$ php -r "shell_exec ('xuất khẩu PHP_TEST = chuỗi');" ; echo $ PHP_TEST

$

Có một cách giải quyết? Nguyên nhân có thể là gì? Tôi đang sử dụng Ubuntu Linux 9.10 "Karmic", nhưng máy chủ FreeBSD cho kết quả tương tự.

Trả lời

3

Nếu bạn đang cố gắng để vượt qua một số đầu ra cho một biến vỏ, bạn có thể làm điều đó như thế này:

$ testvar=$(php -r 'print "hello"') 
$ echo $testvar 
hello 

Hiển thị như thế nào xuất khẩu ảnh hưởng đến điều:

$ php -r '$a=getenv("testvar"); print $a;' 
$ export testvar 
$ php -r '$a=getenv("testvar"); print $a;' 
hello 

Trong những ví dụ, các tương tác vỏ là quá trình cha mẹ và mọi thứ khác được hiển thị là một đứa trẻ (và anh chị em của nhau).

+0

Cảm ơn! Điều đó làm cho câu hỏi rõ ràng. Nhưng sau đó, làm thế nào 'getopt' (và một số chương trình không xây dựng khác) quản lý để xuất các biến vào bối cảnh bên ngoài? (Ví dụ: 'getopt' xuất' $ OPTIND') – kolypto

+0

Bạn đang bối rối '/ usr/bin/getopt' bên ngoài mà không và không thể làm điều đó với' getopts' được tạo sẵn. –

2

Biến môi trường được xuất chỉ có sẵn trong quy trình con.

Vì vậy, bạn sẽ có thể đặt biến môi trường và sau đó sinh ra một tiến trình con. Biến môi trường sẽ được hiển thị trong tiến trình con đó. Tuy nhiên, hãy đặt nó trong php và sau đó khởi chạy một quá trình liên tiếp (echo, trong ví dụ ở trên) sẽ không hoạt động.

Nếu bạn đặt biến và sau đó sinh ra/thực hiện một quy trình mới, nó sẽ được hiển thị trong quy trình mới đó.

Các vấn đề liên quan