У меня есть скрипт, который запускает набор команд, и ему нужно установить некоторую переменную env перед запуском одной из команд. Проблема в том, что системная команда запускается как отдельный процесс, и любые переменные env, которые я там установил, не видны для контекста, в котором работает скрипт. Как я могу это преодолеть?
system("set WALLET=NO");
do some perl commands; #this command needs env variable WALLET=NO to be set
А как насчет system('export WALLET=NO')
?
@ user20284150, спасибо! Не могли бы вы и другие, пожалуйста, также сообщить Perlmonks, если вы снова заметите кросспостинг? Монахи были бы очень признательны за это. =) Я только что разместил там сообщение Re: Запуск системной команды в том же контексте самого скрипта (кросспост)
Переменную окружения можно задать в программе с помощью хэша %ENV
$ENV{WALLET} = 'NO';
run_perl_command_that_needs_ENV()
Переменная, установленная в этой программе, видна в этой программе и ее дочерних элементах, а не в ее родительском элементе.
Как программа «узнает», нужно ли ей его устанавливать? Это будет сообщено операциями оболочки, выполненными ранее, любым способом, который вы сочтете наиболее подходящим. В качестве простого примера они могут вернуть инструкцию для установки переменной
my $set_var = qx("script_that_sets_var_and_returns_flag");
# perhaps need to process the return for the flag value
if ($set_var) {
$ENV{WALLET} = 'NO';
...
}
«Обратные кавычки», используемые здесь в форме оператора qx, возвращают поток stdout из всего, что происходит в подоболочке (в отличие от system
, который этого не делает). Существуют библиотеки, которые намного сложнее (или проще) в выполнении внешних команд.
В зависимости от того, что на самом деле происходит в оболочке, может потребоваться обработка возврата для извлечения значения необходимого флага.
Или операции, выполняемые в оболочке, могут записывать своего рода файл конфигурации, возможно, такой же простой, как строки с парами var=value, а затем обратно в скрипт Perl этот файл можно прочитать. Тогда вам понадобится какой-то протокол, вероятно, довольно простой, для того, какие флаги существуют и что они означают.
С более подробной информацией, возможно, мы сможем дать более точные ответы.
@зим Большое спасибо. Вы избавили меня от многих проблем с этим. Мне было достаточно просто запустить $ENV{WALLET} = 'NO' в скрипте.
@IGORLEVKOVSKY Отлично :). Программа Perl наследует среду от того, что ее запустило, от оболочки, если она запущена с помощью команды оболочки, или от другой программы, если она была запущена таким образом. Это отражено в хеше %ENV
. Таким образом, программа может установить переменные среды, записав этот хэш, а затем использовать его до конца своего выполнения. Кроме того, что бы ни запускала эта программа, это увидит другая программа или оболочка (которая затем запускает другую программу). Но его родитель не может (есть модули, которые обеспечивают даже это).
Обратите внимание, что об этом также спрашивают на Perlmonks