是否有一個相當於 source 的東西可以讓我用批次腳本更改父 bash 進程的環境變數?

是否有一個相當於 source 的東西可以讓我用批次腳本更改父 bash 進程的環境變數?

我的情況是這樣的:我在 Windows 機器上使用 python 和 conda,並且在命令列上主要在 cygwin 中工作。現在 conda 允許不同的 python 環境,類似於 virtualenv,但它僅附帶用於切換環境的 activate.bat 腳本。通常我會做類似的事情source activate env,但這顯然不適用於非 bash 腳本。我的解決方法如下所示:

cmd /C "activate $1 & bash"

效果很好,但有點不令人滿意,因為它感覺像是一種解決方法。有沒有辦法將子進程的環境變數匯入到父進程中?

答案1

在 中cmd,變數預設會洩漏到環境中。你必須用setlocal-包圍你的命令endlocal來明確避免這種情況。因此,您可以使用建議的方法托馬斯·迪基首先將環境變數放入.bat文件中。call

我們通常在 Windows 電腦上執行此操作,方法是提供一個setenv.bat腳本,在呼叫其他腳本之前先在命令提示字元中執行該腳本。

編輯:要為父進程設定環境,我們有時會執行以下操作。只需有一個描述環境的鍵值對檔案:

envkey1=envval1
envkey2=envval2

並在父進程中讀取它並以這種方式調整環境。

我的 Python-fu 不是那麼好,但在 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不會停止「父」批次程序,所以更接近所要求的 shell「來源」。我在批次檔中使用它,這些檔案在稍後在腳本中使用它們之前會建立環境變數。

但是,尚不清楚您在中指的是哪個「父」進程

cmd /C "activate $1 & bash"

因為您報告您正在將變數傳播activate.bat到後續bash命令中(除非您指的是 的父命令cmd)。

相關內容