Есть ли эквивалент источника, который позволяет мне создать пакетный скрипт, изменяющий переменные среды родительского процесса bash?

Есть ли эквивалент источника, который позволяет мне создать пакетный скрипт, изменяющий переменные среды родительского процесса bash?

У меня такая ситуация: я использую python с conda на машине с Windows и работаю в основном в cygwin, когда нахожусь в командной строке. Теперь conda позволяет использовать различные среды python, похожие на virtualenv, но он поставляется только со скриптом activation.bat для переключения сред. Обычно я делаю что-то вроде source activate env, но это, очевидно, не работает с не-bash скриптом. Мой обходной путь выглядит так:

cmd /C "activate $1 & bash"

Что работает нормально, но немного неудовлетворительно, потому что это похоже на обходной путь. Есть ли способ импортировать переменные среды дочернего процесса в родительский процесс?

решение1

В cmdпеременные по умолчанию просачиваются в среду. Вам нужно окружить свои команды setlocal-, endlocalчтобы явно этого избежать. Поэтому вы можете использовать подход, предложенныйТомас Дикипоместить переменные среды в .batфайл и callсделать это в первую очередь.

Обычно мы делаем это на компьютерах с Windows, предоставляя setenv.batскрипт, который сначала запускаем в командной строке, прежде чем вызывать другие скрипты.

Редактировать: чтобы задать среду для родительского процесса, мы иногда делаем следующее. Просто создаем файл пар ключ-значение, описывающий среду:

envkey1=envval1
envkey2=envval2

и прочитать это в родительском процессе и соответствующим образом настроить среду.

Я не очень хорош в Python, но в Perl вы бы сделали что-то вроде

open(my $f, '<', 'env.txt');
while (<$f>) {
  chomp;
  my ($k, $v) = split(m/=/, $_, 2); # assumes '=' as separator
  $ENV{$k} = $v; # updates the current environment
}
close($f);

решение2

Вероятно, нет. Ваше использование "&" в cmdвызове - это самое близкое, что вы могли бы получить. Вы могли бы сделать его немного чище, используяcallдля скрипта "activate.bat".

Потому что callне останавливает "родительскую" пакетную программу, которая находится ближе к "источнику" оболочки, который был запрошен. Я использую это в пакетных файлах, которые создают переменные окружения перед их последующим использованием в скрипте.

Однако неясно, о каком «родительском» процессе идет речь.

cmd /C "activate $1 & bash"

поскольку вы сообщаете, что вы распространяете переменные из activate.batв последующую bashкоманду (если вы не имеете в виду родительскую команду cmd).

Связанный контент