【问题标题】:Git-Bash is Interpolating Environment VariablesGit-Bash 是插入环境变量
【发布时间】:2021-11-16 00:44:52
【问题描述】:

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

我有一个使用os.environ 的python 脚本来提取环境变量以与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 调试器中运行时也会显示效果。此外,如果使用winpty 运行 python,我看不到这种效果。我查看了os.environ 上的文档以及 git bash 使用的环境变量,但没有找到任何可以解释这一点的东西。

printenv 也显示了正确的值,所以我倾向于认为这是特定于 git bash 初始化 python 的方式,但我似乎无法确定实际发生的情况

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

回声

$ echo $random
/var/

printf

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

蟒蛇

$ 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”文件夹路径的变化是从更新到v2.33.0.2-64bit的Git Bash。问题还是一样。

【问题讨论】:

  • 您是在 描述 shell 的输出,而不是 显示 该输出。我们两者都需要。理想情况下,显示命令 declare -p sftp_wdir 的确切输出——或者,为了更稳健地对抗带有隐藏字符的值,printf '%q\n' "$sftp_wdir"
  • 顺便说一句,“git bash”最好被描述为“msys bash”。它不是由 git 团队制作的,也不是特定于 git 的; msys 是它编译的 Windows 兼容性库的名称。

标签: python python-3.x environment-variables git-bash msys


【解决方案1】:

这是 msys 的行为,它是编译 Git Bash 的 Windows 兼容库。涵盖此行为的文档位于 https://www.msys2.org/docs/filesystem-paths/

有一个环境变量可以关闭它:

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

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 2020-10-07
    • 2011-11-13
    • 2018-12-29
    • 2016-04-30
    • 2018-02-09
    • 2023-01-22
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多