Existe um equivalente à fonte que me permite ter um script em lote para alterar as variáveis de ambiente do processo bash pai?

1

Minha situação é esta: eu uso o python com o conda em uma máquina windows, e trabalho principalmente no cygwin quando na linha de comando. Agora, o conda permite diferentes ambientes python, semelhantes ao virtualenv, mas só vem com um script activation.bat para alternar os ambientes. Normalmente eu faria algo como source activate env , mas obviamente isso não funciona com um script não-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?

    
por kutschkem 20.05.2015 / 10:52

2 respostas

0

Em cmd , as variáveis são vazadas para o ambiente por padrão. Você tem que cercar seus comandos por setlocal - endlocal para explicitamente evitar isso. Portanto, você pode usar a abordagem sugerida por Thomas Dickey para colocar suas variáveis de ambiente em um .bat file e call primeiro.

Normalmente, fazemos isso em máquinas Windows, fornecendo um script setenv.bat 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 de valores-chave descrevendo o ambiente:

envkey1=envval1
envkey2=envval2

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

Meu Python-fu não é ótimo, 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);
    
por 20.05.2015 / 12:01
0

Provavelmente não. Seu uso de "&" em uma chamada cmd é o mais próximo possível. Você pode fazer com que pareça um pouco mais limpo usando call para "ativar. bat "script".

Porque call não pára o programa em lote "pai", que está mais próximo da "origem" 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 qual processo "pai" você está se referindo em

cmd /C "activate $1 & bash"

desde que você relate que está propagando variáveis de activate.bat para o comando bash subseqüente (a menos que você queira dizer pai de cmd ).

    
por 20.05.2015 / 11:04