1 votes

Existe-t-il un équivalent à source qui me permette de faire en sorte qu'un script batch script modifie les variables d'environnement du processus bash parent ?

Ma situation est la suivante : J'utilise Python avec conda sur une machine Windows, et je travaille principalement en cygwin quand je suis en ligne de commande. Maintenant, conda permet d'avoir différents environnements Python, similaires à virtualenv, mais il n'est livré qu'avec un script script d'activation.bat pour changer d'environnement. Normalement, je ferais quelque chose comme source activate env mais cela ne fonctionne évidemment pas avec un script non-bash. Ma solution ressemble à ceci :

cmd /C "activate $1 & bash"

Cela fonctionne bien, mais c'est un peu insatisfaisant parce que cela ressemble à une solution de contournement. Existe-t-il un moyen d'importer les variables d'environnement d'un processus enfant dans le processus parent ?

0voto

Thomas Dickey Points 8167

Probablement pas. Votre utilisation de "&" dans un cmd L'appel est le plus proche possible. Vous pourriez peut-être le rendre un peu plus propre en utilisant call pour le script "activate.bat" script.

Parce que call n'arrête pas le programme batch "parent", qui est plus proche de la Shell "source" demandée. Je l'utilise dans les fichiers batch qui construisent des variables d'environnement avant de les utiliser plus tard dans le Shell.

Cependant, il n'est pas clair de savoir à quel processus "parent" vous faites référence dans le

cmd /C "activate $1 & bash"

puisque vous signalez que vous propagez des variables à partir de activate.bat dans la suite de la bash (à moins qu'il ne s'agisse du parent de cmd ).

0voto

Atafar Points 151

En cmd les variables sont transmises par défaut à l'environnement. Vous devez donc entourer vos commandes de setlocal - endlocal pour éviter explicitement ce problème. Par conséquent, vous pouvez utiliser l'approche suggérée par Thomas Dickey pour placer vos variables d'environnement dans un .bat et call que d'abord.

Nous procédons généralement de la sorte sur les machines Windows, en fournissant un fichier setenv.bat script que nous exécutons d'abord à l'invite de commande avant d'invoquer d'autres script.

Modification : pour définir un environnement pour un processus parent, nous procédons parfois de la manière suivante. Il suffit d'avoir un fichier de paires clé-valeur décrivant l'environnement :

envkey1=envval1
envkey2=envval2

et de le lire dans le processus parental et d'ajuster l'environnement de cette manière.

Ma connaissance de Python n'est pas très bonne, mais en Perl, vous feriez quelque chose comme

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X