2013-12-13 4 views
1

В моем скрипте perl я хочу получить переменную окружения моей переменной perl. Я могу это сделатьКак я могу получить изменяющуюся переменную среды в perl

$no_of_lic = $ENV{`ON_OF_ENV`}; 

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

мой код:

!/usr/local/bin/perl -w 

$no_of_lic = $ARGV[0]; 

$ENV{'NO_OF_LIC'} = $no_of_lic; 

print "No of lic to be picked : $no_of_lic\n"; 

print "Environment var : $ENV{NO_OF_LIC}\n"; 

sleep(1); 

while ($no_of_lic != 0) { 

    sleep(1); 

    print "no of lic : $no_of_lic\n"; 

    #$no_of_lic = $ENV{'NO_OF_LIC'}; 

    sleep(10); 

} 

в то время как скрипт работает в фоновом я изменю переменные окружения setenv $NO_OF_ENV 5

После того, как я это сделать, я ожидал, что сценарий будет печатать с обновленными значениями как 5

но его не происходит .. может ли кто-нибудь сказать, как это сделать?

+6

Программам предоставляется среда, когда они начинаются. Изменение среды в родительском (или любом другом процессе) не обновляет среду дочернего процесса. Если вам нужно общаться с программой, подумайте о том, чтобы использовать файл (каждый раз читайте его в цикле) или какой-либо другой механизм IPC (сокеты, база данных и т. Д.). –

+0

@KyleBurton: Пожалуйста, опубликуйте это как ответ. – Borodin

+0

Выполнено, но уже есть ответы на другие вопросы ... Спасибо @Borodin –

ответ

12

Это не так, как работают переменные среды.

Когда ваш скрипт Perl запущен, он получает клон среды вашей оболочки. После этого, пока скрипт Perl запущен, любые изменения в среде вашей оболочки не будут видны в копии среды Perl. (И любые изменения в вашей среде Perl не будут видны вашей оболочкой.)

Это не относится к Perl - все языки сценариев будут вести себя одинаково в этом отношении. Это просто, как среда внедрена в Unix. (И я считаю, что Windows их реализует аналогично.)

Если вам нужно отправить новые данные в скрипт Perl, который работает в фоновом режиме, изучите такие параметры, как FIFO (иначе называемые каналы) или сокеты (например, TCP Розетки). Более широкий термин для этой концепции - межпроцессная коммуникация (IPC), а раздел perlipc perldoc содержит больше информации по этой теме.

+0

Спасибо bybyink .. у вас есть какой-нибудь пример, чтобы разобраться в этом через IPC – user3099290

6

Реальные процессы получат копию всех переменных из их родительского процесса. Более поздние изменения переменных родительского процесса не будут отражены в его дочерних процессах.

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

2

Программам предоставляется их окружающая среда, когда они начинаются. Изменение среды в родительском (или любом другом процессе) не обновляет среду дочернего процесса. Если вам нужно общаться с программой, подумайте о том, чтобы использовать файл (каждый раз читайте его в цикле) или какой-либо другой механизм IPC (сокеты, база данных и т. Д.).

+0

можно усовершенствовать, как я могу использовать IPC? – user3099290

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