バッチ スクリプトで親 bash プロセスの環境変数を変更できるようにするソースと同等のものはありますか?

バッチ スクリプトで親 bash プロセスの環境変数を変更できるようにするソースと同等のものはありますか?

私の状況は次のとおりです。Windows マシンで conda を使って Python を使用し、コマンド ラインでは主に cygwin で作業しています。現在、conda は virtualenv と同様にさまざまな Python 環境を許可していますが、環境を切り替えるための activation.bat スクリプトのみが付属しています。通常は のようにするのですsource activate envが、これは明らかに bash 以外のスクリプトでは機能しません。私の回避策は次のようになります。

cmd /C "activate $1 & bash"

これは問題なく動作しますが、回避策のように感じられるため、少し満足できません。子プロセスの環境変数を親プロセスにインポートする方法はありますか?

答え1

ではcmd、変数はデフォルトで環境に漏洩します。これを明示的に回避するには、コマンドをsetlocal-で囲む必要がありますendlocal。したがって、トーマス・ディッキー環境変数を.batファイルに入れて、callそれを最初に行います。

通常、Windows マシンでは、setenv.bat他のスクリプトを呼び出す前にコマンド プロンプトで最初に実行するスクリプトを提供することでこれを実行します。

編集: 親プロセスの環境を設定するには、次の操作を実行することがあります。環境を記述するキーと値のペアのファイルを用意するだけです。

envkey1=envval1
envkey2=envval2

それを親プロセスで読み取り、そのように環境を調整します。

私はPythonがあまり得意ではないのですが、Perlでは次のようにします。

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

答え2

おそらくそうではありません。呼び出しで「&」を使用するのが、cmdほぼ理想に近いでしょう。call「activate.bat」スクリプト用。

「親」バッチ プログラムを停止しないためcall、要求されたシェルの「ソース」に近くなります。スクリプト内で後で使用する前に環境変数を構築するバッチ ファイルでこれを使用します。

しかし、どの「親」プロセスを指しているのか不明です。

cmd /C "activate $1 & bash"

からの変数をactivate.bat後続のbashコマンドに伝播していると報告しているためです ( の親を意味している場合を除くcmd)。

関連情報