open
с конвейером создает новый процесс † , а затем ваш set.bat
запускается в этом процессе и устанавливает эту переменную среды в этого процесса , который затем завершается.
Затем get.bat
работает в другом процессе и ничего не видит в первом процессе.
Однако они оба наследуют среду процесса, в котором выполняется ваш скрипт Perl. Таким образом, вы можете установить необходимую среду в скрипте (например, через %ENV
), а затем создать подпроцесс, а затем этот подпроцесс увидит среду. ‡
С другой стороны, вы можете запустить оба сценария оболочки в одном и том же подпроцессе, если это соответствует вашим целям, например, через system
. Затем можно export
изменить переменную в среде, и после ее source
-дедания ее увидит следующий запущенный скрипт. Вот пример в Linux (прямо сейчас не могу Windows).
Программа командной строки ("one-liner")
perl -we'system("/bin/bash", "-c", q(source set.bat.sh; get.bat.sh))'
с файлом set.bat.sh
#!/bin/bash
VAR=20
export VAR
и файл get.bat.sh
#!/bin/bash
echo $VAR
Однострочник печатает одну строку с 20
.
† Канал - open
обычно называется fork
процессом (см. open ), но на Windows, который может быть эмулирован (только через потоки), так как нет собственного fork
; см. perlfork . Однако perlport указывает, что в Windows pipe- open
создает подпроцесс (через Win32 API).
‡ A Linux пример (не могу проверить в Windows сейчас)
perl -we'$v = qx("set.bat.sh"); chomp $v; $ENV{VAR} = $v; system("get.bat.sh")'
с set.bat.sh
файлом
#!/bin/bash
VAR=20
echo $VAR
и get.bat.sh
#!/bin/bash
echo $VAR
Поскольку подпроцесс не может напрямую изменить среду своего родителя, set.bat.sh
печатает $VAR
до STDOUT
, а затем его родитель, скрипт perl, может прочитать его из этого потока (захваченный qx
) и установить его в его собственном окружении, которое наследует его следующий (великий) ребенок get.bat.sh
. (A system
разветвляет процесс, и в нем разветвляется другой процесс для запуска get.bat.sh
. Среда передается.)
Слабость этого, конечно, заключается в том, что сценарий perl нуждается в чтобы узнать имя переменной, VAR
. В этом случае set.bat
улучшит отправку самого имени вместе со значением.