Запустить системную команду в том же контексте самого скрипта

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

system("set WALLET=NO");
do some perl commands; #this command needs env variable WALLET=NO to be set

Обратите внимание, что об этом также спрашивают на Perlmonks

user20284150 10.04.2023 15:11

А как насчет system('export WALLET=NO')?

Rawley Fowler 10.04.2023 19:37

@ user20284150, спасибо! Не могли бы вы и другие, пожалуйста, также сообщить Perlmonks, если вы снова заметите кросспостинг? Монахи были бы очень признательны за это. =) Я только что разместил там сообщение Re: Запуск системной команды в том же контексте самого скрипта (кросспост)

LanX 11.04.2023 03:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переменную окружения можно задать в программе с помощью хэша %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' в скрипте.

IGOR LEVKOVSKY 13.04.2023 09:26

@IGORLEVKOVSKY Отлично :). Программа Perl наследует среду от того, что ее запустило, от оболочки, если она запущена с помощью команды оболочки, или от другой программы, если она была запущена таким образом. Это отражено в хеше %ENV. Таким образом, программа может установить переменные среды, записав этот хэш, а затем использовать его до конца своего выполнения. Кроме того, что бы ни запускала эта программа, это увидит другая программа или оболочка (которая затем запускает другую программу). Но его родитель не может (есть модули, которые обеспечивают даже это).

zdim 17.04.2023 19:35

Другие вопросы по теме