是否有与源等效的函数允许我使用批处理脚本来改变父 bash 进程的环境变量?

是否有与源等效的函数允许我使用批处理脚本来改变父 bash 进程的环境变量?

我的情况是这样的:我在 Windows 机器上使用 python 和 conda,在命令行上主要在 cygwin 中工作。现在 conda 允许不同的 python 环境,类似于 virtualenv,但它只附带一个用于切换环境的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不会停止“父”批处理程序,所以它更接近于请求的 shell“源”。我在批处理文件中使用它,这些批处理文件会在稍后的脚本中使用环境变量之前建立环境变量。

但是,目前还不清楚你指的是哪个“父”进程

cmd /C "activate $1 & bash"

因为您报告您正在将变量传播到activate.bat后续bash命令中(除非您的意思是的父级cmd)。

相关内容