2010-01-04 3 views
5

Я пытаюсь установить переменную, которая должна быть доступна из-за пределов PHP. В идеале это должна быть локальная переменная, но переменные среды также приветствуются.Экспортировать переменную из PHP в оболочку

Во-первых, я попытался putenv(), но это не дает никакого результата:

$ PHP -r "PutEnv ('PHP_TEST = строка');" ; Эхо $ PHP_TEST

$

Когда я называю getenv() из того же самого сценария - это приводит к правильному значению 'строка'. Безопасный режим выключен, но руководство говорит префикс «php_» имеет жизненно важное значение с безопасным = на так что я использую его только в случае :)

Тогда я пытаюсь system() или shell_exec():

$ PHP -r "shell_exec ('PHP_TEST = строка');" ; echo $ PHP_TEST

$ php -r "shell_exec ('export PHP_TEST = string');" ; Эхо $ PHP_TEST

$

Есть обходной путь? что может быть причиной? Я использую Ubuntu Linux 9.10 «Karmic», но сервер FreeBSD дает тот же результат.

ответ

3

Если вы пытаетесь передать некоторый вывод в переменную оболочки, вы можете сделать это следующим образом:

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

Показывая, как экспорт влияет на вещи:

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

В этих примерах интерактивная оболочка - это родительский процесс, а все остальное - это ребенок (и братья и сестры друг друга).

+0

Спасибо! Это делает вопрос ясным. Но тогда, как «getopt» (и некоторые другие не встроенные программы) удается экспортировать переменные во внешний контекст? (Например, 'getopt' export' $ OPTIND') – kolypto

+0

Вы вводите в заблуждение внешний '/ usr/bin/getopt', который не делает этого и не может сделать это с встроенным' getopts', который делает. –

2

Переменные среды, которые экспортируются, доступны только в дочерних процессах.

Таким образом, вы сможете установить переменную окружения, а затем создать дочерний процесс. Переменная среды будет видна в этом дочернем процессе. Однако установка его в php, а затем запуск последовательного процесса (echo, в вашем примере выше) не будет работать.

Если вы установите переменную, а затем породите/выполните новый процесс, она должна быть видимой в этом новом процессе.

Смежные вопросы