Gibt es ein Äquivalent zur Quelle, das es mir ermöglicht, mit einem Batch-Skript die Umgebungsvariablen des übergeordneten Bash-Prozesses zu ändern?

Gibt es ein Äquivalent zur Quelle, das es mir ermöglicht, mit einem Batch-Skript die Umgebungsvariablen des übergeordneten Bash-Prozesses zu ändern?

Meine Situation ist folgende: Ich verwende Python mit Conda auf einem Windows-Rechner und arbeite hauptsächlich in Cygwin, wenn ich auf der Kommandozeile bin. Conda ermöglicht verschiedene Python-Umgebungen, ähnlich wie virtualenv, wird aber nur mit einem activation.bat-Skript zum Umschalten der Umgebungen ausgeliefert. Normalerweise würde ich so etwas machen wie source activate env, aber das funktioniert offensichtlich nicht mit einem Nicht-Bash-Skript. Meine Problemumgehung sieht folgendermaßen aus:

cmd /C "activate $1 & bash"

Das funktioniert gut, ist aber ein wenig unbefriedigend, weil es sich wie eine Problemumgehung anfühlt. Gibt es eine Möglichkeit, die Umgebungsvariablen eines untergeordneten Prozesses in den übergeordneten Prozess zu importieren?

Antwort1

In cmdwerden Variablen standardmäßig an die Umgebung weitergegeben. Sie müssen Ihre Befehle mit setlocal- umgeben endlocal, um dies explizit zu vermeiden. Daher können Sie den von vorgeschlagenen Ansatz verwendenThomas Dickeyum Ihre Umgebungsvariablen in eine .batDatei zu packen und callzwar zuerst.

Normalerweise tun wir dies auf Windows-Rechnern, indem wir ein setenv.batSkript bereitstellen, das wir zuerst in der Eingabeaufforderung ausführen, bevor wir andere Skripte aufrufen.

Bearbeiten: Um eine Umgebung für einen übergeordneten Prozess festzulegen, gehen wir manchmal wie folgt vor. Sie benötigen lediglich eine Datei mit Schlüssel-Wert-Paaren, die die Umgebung beschreiben:

envkey1=envval1
envkey2=envval2

und lesen Sie das im übergeordneten Prozess und passen Sie die Umgebung entsprechend an.

Mein Python-Fu ist nicht so toll, aber in Perl würde man so etwas machen wie

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

Antwort2

Wahrscheinlich nicht. Ihre Verwendung von "&" in einem cmdAufruf ist so nah dran, wie Sie nur kommen können. Sie können es vielleicht ein wenig sauberer aussehen lassen, indem Siecallfür das Skript „activate.bat“.

Weil dadurch calldas „übergeordnete“ Batchprogramm nicht gestoppt wird, das sich näher an der angeforderten Shell-„Quelle“ befindet. Ich verwende dies in Batchdateien, die Umgebungsvariablen aufbauen, bevor sie später im Skript verwendet werden.

Es ist jedoch unklar, auf welchen „übergeordneten“ Prozess Sie sich beziehen in

cmd /C "activate $1 & bash"

activate.batda Sie melden, dass Sie Variablen von in den nachfolgenden Befehl weitergeben bash(es sei denn, Sie meinen das übergeordnete Element von cmd).

verwandte Informationen