Existe um equivalente à fonte que me permite fazer com que um script em lote altere as variáveis ​​de ambiente do processo bash pai?

Existe um equivalente à fonte que me permite fazer com que um script em lote altere as variáveis ​​de ambiente do processo bash pai?

Minha situação é a seguinte: eu uso python com conda em uma máquina Windows e trabalho principalmente no cygwin quando estou na linha de comando. Agora o conda permite diferentes ambientes python, semelhantes ao virtualenv, mas só vem com um script activate.bat para alternar os ambientes. Normalmente eu faria algo parecido source activate env, mas isso obviamente não funciona com um script que não seja bash. Minha solução alternativa é assim:

cmd /C "activate $1 & bash"

O que funciona bem, mas é um pouco insatisfatório porque parece uma solução alternativa. Existe uma maneira de importar as variáveis ​​de ambiente de um processo filho para o processo pai?

Responder1

Em cmd, as variáveis ​​são vazadas para o ambiente por padrão. Você deve cercar seus comandos por setlocal- endlocalpara evitar isso explicitamente. Portanto, você pode usar a abordagem sugerida porThomas Dickeypara colocar suas variáveis ​​de ambiente em um .batarquivo e callisso primeiro.

Geralmente fazemos isso em máquinas Windows, fornecendo um setenv.batscript que executamos primeiro no prompt de comando antes de invocar outros scripts.

Editar: para definir um ambiente para um processo pai, às vezes fazemos o seguinte. Basta ter um arquivo de pares chave-valor descrevendo o ambiente:

envkey1=envval1
envkey2=envval2

e leia isso no processo pai e ajuste o ambiente dessa forma.

Meu Python-fu não é tão bom, mas em Perl você faria algo como

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);

Responder2

Provavelmente não. O uso de "&" em uma cmdchamada é o mais próximo possível. Você pode conseguir fazer com que pareça um pouco mais limpo usandocallpara o script "activate.bat".

Porque callnão para o programa em lote "pai", que está mais próximo da "fonte" do shell que foi solicitada. Eu uso isso em arquivos em lote que criam variáveis ​​de ambiente antes de usá-las posteriormente no script.

No entanto, não está claro a qual processo "pai" você está se referindo

cmd /C "activate $1 & bash"

já que você relata que está propagando variáveis ​​para activate.bato comando subsequente bash(a menos que você se refira ao pai de cmd).

informação relacionada