Git-Bash 是插值环境变量

Git-Bash is Interpolating Environment Variables

我想知道是否有人可以解释以下奇怪的行为:

我有一个 python 脚本,使用 os.environ 提取环境变量以供 pysftp 使用。有问题的变量被称为“sftp_wd”和“sftp_wdir”,值为“/etc/”,两者的效果相同。

>>> import os
>>> os.environ["sftp_wdir"]

cmd 中的 python 代码产生正确的值:/etc/...

但是当 git 中的 运行 bash 值看起来像:<%USERPROFILE%/AppData/Local/Programs/Git>/etc/...

我在这两种情况下都使用相同的 conda 环境,当 运行 在 vscode 调试器中时效果也会出现。此外,如果 运行ning python 与 winpty 我看不到这种效果。我查看了 os.environ 和 git bash 使用的环境变量的文档,但没有找到任何解释这一点的内容。

printenv 也显示正确的值所以我倾向于相信这是特定于 git bash 是如何初始化 python 但我似乎不能确定实际发生的事情

编辑: 作为对@CharlesDuffy 的回应,这似乎可以用任何环境变量和任何以“/”开头的值来复制 示例 我创建了一个名为 random 的环境变量,其值为 /var/。结果如下:

回声

$ echo $random
/var/

printf

$ printf '%q\n' "$random"
/var/

python

$ python
Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)] :: Ana
conda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['random']
'C:/Program Files/Git/var/'
>>>

注意:上面“Git”文件夹的路径变化是从更新到[=72=的v2.33.0.2-64bit ] Bash。问题还是一样。

这是 msys 的行为,Windows-compatibility library Git Bash 是用它编译的。有关此行为的文档位于 https://www.msys2.org/docs/filesystem-paths/

可以使用环境变量将其关闭:

  • 要完全关闭环境变量中的自动路径转换,export MSYS2_ENV_CONV_EXCL='*'
  • 仅对名为 random 的变量关闭它:export MSYS2_ENV_CONV_EXCL=random