¿Existe un equivalente a la fuente que me permita hacer que un script por lotes altere las variables de entorno del proceso bash principal?

¿Existe un equivalente a la fuente que me permita hacer que un script por lotes altere las variables de entorno del proceso bash principal?

Mi situación es la siguiente: uso Python con conda en una máquina con Windows y trabajo principalmente en cygwin cuando estoy en la línea de comando. Ahora conda permite diferentes entornos de Python, similar a virtualenv, pero solo viene con un script de activación.bat para cambiar los entornos. Normalmente haría algo como source activate env, pero obviamente eso no funciona con un script que no sea bash. Mi solución se ve así:

cmd /C "activate $1 & bash"

Lo cual funciona bien pero es un poco insatisfactorio porque parece una solución alternativa. ¿Existe alguna forma de importar las variables de entorno de un proceso hijo al proceso padre?

Respuesta1

En cmd, las variables se filtran al entorno de forma predeterminada. Tienes que rodear tus comandos con setlocal- endlocalpara evitar esto explícitamente. Por lo tanto, puede utilizar el enfoque sugerido porThomas Dickeyponer las variables de entorno en un .batarchivo y calleso primero.

Normalmente hacemos esto en máquinas con Windows, proporcionando un setenv.batscript que ejecutamos primero en el símbolo del sistema antes de invocar otros scripts.

Editar: para establecer un entorno para un proceso principal, a veces hacemos lo siguiente. Simplemente tenga un archivo de pares clave-valor que describan el entorno:

envkey1=envval1
envkey2=envval2

y leer eso en el proceso principal y ajustar el entorno de esa manera.

Mi Python-fu no es tan bueno, pero en Perl harías 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);

Respuesta2

Probablemente no. El uso de "&" en una cmdllamada es lo más parecido que puedes conseguir. Es posible que puedas hacer que se vea un poco más limpio usandocallpara el script "activate.bat".

Porque callno detiene el programa por lotes "principal", que está más cerca de la "fuente" del shell que se solicitó. Utilizo esto en archivos por lotes que crean variables de entorno antes de usarlas más adelante en el script.

Sin embargo, no está claro a qué proceso "principal" se refiere en

cmd /C "activate $1 & bash"

ya que informa que está propagando variables desde activate.batel bashcomando posterior (a menos que se refiera al padre de cmd).

información relacionada