【MSYS2】隐式路径风格转换

2023-05-16

【MSYS2】隐式路径风格转换

  • 路径风格
  • 转换规则
    • Cygwin工具
    • MSYS2不会自动将Windows风格的路径转换为Unix风格
    • Windows原生工具
    • 在特定情况下,MSYS2会自动将“貌似Unix风格的路径”转换为Windows风格

参考文档:https://www.msys2.org/docs/filesystem-paths/

路径风格

Windows系统和Unix系统有两套截然不同的文件路径风格,我们平时遇到的路径形式大致如下:

    1. C:\nope该字符串是一个合法的Windows绝对路径,代表C盘下的nope文件或目录。
      该字符串不是合法的Unix路径。
    1. C:/nope该字符串是一个合法的Windows绝对路径,代表C盘下的nope文件或目录。
      该字符串不是合法的Unix路径。
    1. /foo该字符串是一个合法的Windows相对路径,代表当前盘符下的foo文件或目录(如果程序的当前工作目录在C盘,则其表示的绝对路径为C:\foo)。
      同时,该字符串也是一个合法的Unix绝对路径,代表根目录/下的foo文件或目录。
      在日常编程中,绝大多数情况下/foo都指代Unix绝对路径,因此我们把这种路径风格称为Unix路径风格,或称为貌似Unix的路径风格
    1. foo/bar该字符串是一个合法的Windows相对路径,也是一个合法的Unix相对路径,都代表程序当前工作目录下的foo/目录下的bar文件或目录。

转换规则

Cygwin工具

如果你的可执行文件被安装到/usr/bin这个位置,或者在安装包时不需要指定包前缀,则该包属于MSYS环境。通过这些包安装的程序被称为Cygwin工具

举例

  • /usr/bin/ls, /usr/bin/cat, /usr/bin/bash这些可执行文件都属于Cygwin工具
  • 通过pacman安装的没有包前缀的包也属于Cygwin工具。如通过如下命令pacman -S vim, pacman -S git安装的/usr/bin/vim/usr/bin/git

Cygwin工具只保证正确解析Unix风格的路径,是否可以正确解析Windows风格的路径,取决于该Cygwin工具的内部实现。

MSYS2不会自动将Windows风格的路径转换为Unix风格

如果你提供了Windows风格的路径给某个Cygwin工具,MSYS2并不会自动将Windows风格的路径转换为Unix风格,能否正确解析该路径字符串,完全依赖于该Cygwin工具的内部实现。

举例

  • ls命令对应着Cygwin工具/usr/bin/ls。在执行ls C:/Users命令时,MSYS2并不会自动将Windows风格的路径C:/Users转换为Unix风格的路径/c/Users。之所以该命令能够正确执行,是因为Cygwin工具/usr/bin/ls在底层实现中调用了Windows系统的API,并且/usr/bin/ls原封不动地将输入参数C:/Users传递给了底层Windows接口。

Windows原生工具

如果你的可执行文件被安装到类似/ucrt64/bin, /mingw64/bin这些位置,或者在安装包时指定了包前缀,则该包属于其它环境(如UCRT64环境、MINGW64环境等)。通过这些包安装的程序被称为Windows原生工具
此外,如果在MSYS2中直接执行Windows系统上原生安装的程序,这些“Windows系统上原生安装的程序“也算作Windows原生工具

举例

  • 通过pacman安装的指定了包前缀的包属于Windows原生工具。如通过如下命令pacman -S mingw-w64-ucrt-x86_64-python, pacman -S mingw-w64-x86_64-perl安装的/ucrt64/bin/python3/mingw64/bin/perl
  • 在MSYS2中使用Windows上原生安装的应用程序,这些程序也算作Windows原生工具。比如我在Windows系统上从Python官网安装了python解释器,然后在MSYS2中使用了它,那么这个python解释器也属于Windows原生工具

Windows原生工具只保证正确解析Windows风格的路径,这些程序和你在Windows上直接安装的其它原生程序没有本质区别。

举例

  • 假设我们的MSYS2安装在C:/msys64/目录下。
  • 让Windows原生工具/ucrt64/bin/python3执行以下脚本文件path_test.py,脚本的含义是“打印/Users/目录的绝对路径”。
# path_test.py
import os
print(os.path.abspath('/Users/'))

我们已经知道,/Users/这种路径风格在Windows和Unix下都是合法的,但代表的含义不同。那么Windows原生工具/ucrt64/bin/python3会将这个路径理解为哪种风格呢?
观察解释器的输出:

/ucrt64/bin/python3 path_test.py
# 返回 C:/Users

结果很明了,Windows原生工具/ucrt64/bin/python3将路径/Users/理解为一个Windows风格的相对路径
在MSYS2中使用这类Windows原生工具的时候,请特别小心这种情况!因为Windows原生工具只保证正确解析Windows风格的路径,如果你在脚本文件中试图使用Unix风格的绝对路径(如/tmp/等),这些路径将会被Windows原生工具理解为Windows风格的相对路径/tmp/被理解为工作盘符:/tmp/),这完全不是你想要的结果!

在特定情况下,MSYS2会自动将“貌似Unix风格的路径”转换为Windows风格

尽管Windows原生工具只保证正确解析Windows风格的路径,MSYS2为我们提供了两种“隐式路径风格转换”的情况——如果你通过以下两种方式之一

    1. Bash命令行传参
    1. Bash环境变量

提供了貌似Unix风格的路径给某个Windows原生工具,MSYS2会自动将貌似Unix风格的路径转换为Windows风格。最终,这个Windows原生工具会接收到一个“被MSYS2隐式转换后”的Windows风格路径。

举例

  • 假设我们的MSYS2安装在C:/msys64/目录下。
  • 通过Bash命令行给Windows原生工具/ucrt64/bin/python3提供一个“貌似Unix风格的”绝对路径参数--dir=/foo。通过返回的结果可以发现,Python接受的第二个输入参数被MSYS2自动转换为了--dir=C:/msys64/foo
    MSYS2自动将/foo路径中的”根目录/“替换为了MSYS2的安装目录C:/msys64/
/ucrt64/bin/python3 -c "import sys; print(sys.argv)" --dir=/foo
# 返回 ['-c', '--dir=C:/msys64/foo']
  • 通过Bash环境变量给Windows原生工具/ucrt64/bin/python3提供包含“貌似Unix路径”的环境变量MYVAR=/foo。通过返回的结果可以发现,Python在读取环境变量MYVAR值的时候,值被MSYS2自动转换为了C:/msys64/foo
MYVAR=/foo /ucrt64/bin/python3 -c "import os; print(os.environ['MYVAR'])"
# 返回 C:/msys64/foo

再次强调,MSYS2的隐式路径转换只有在以下两种情况时有效

    1. Bash命令行传参
    1. Bash环境变量

如果你在Python脚本文件里写了/foo路径,然后让Windows原生的Python解释器去执行这个脚本,那么解释器会直接将它理解为Windows风格的相对路径盘符:/foo,而不是MSYS2隐式转换过的MSYS2安装目录/foo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MSYS2】隐式路径风格转换 的相关文章

  • 【MSYS2】隐式路径风格转换

    MSYS2 隐式路径风格转换 路径风格转换规则Cygwin工具MSYS2不会自动将Windows风格的路径转换为Unix风格Windows原生工具在特定情况下 xff0c MSYS2会自动将 貌似Unix风格的路径 转换为Windows风格
  • VS2022解决Protobuf compiler version 23.4 doesn‘t match library version 4.23.4

    在使用Visual Studio 2022 MinGW CMake作为开发环境时 如果项目中使用了Protobuf 则在CMake运行时 可能会出现Protobuf compiler version 23 4 doesn t match l
  • 使用msys2 mingw64编译gcc

    我们在msys2中使用pacman安装的GCC默认是不能显示中文帮助的 而Linux下是可以显示中文的 这是因为在编译msys2 Mingw在编译GCC时 是没有打开 enable nls开关的 为了让其可以显示中文 可以尝试自己编译GCC
  • msys2 pacman常用命令以及添加国内源加速pacman

    转载请注明作者和出处 http blog csdn net john bh 文章目录 常见命令 安装软件 更新系统 卸载软件 搜索软件 查询软件信息 软件包组 清理缓存 最常用的pacman命令小结 给MSYS2 添加源 添加清华源和中科大
  • MSYS2 如何添加国内源

    用MSYS2 pacman S 安装包的速度让你怀疑人生 所以需要将源换成国内源 步骤 lt 1 gt 打开MSYS2软件内的 etc pacman d 其中有3个文件 mirrorlist mingw32 mirrorlist mingw
  • msys2 安装 mingw64

    https blog csdn net zhuwade article details 121944279
  • MSYS2 Mingw Cygwin对比

    系列文章目录 文章目录 系列文章目录 前言 一 MSYS2 是什么 前言 Mingw 仅支持 32 bit 程序 现在一般用 Mingw w64 既支持 32 也支持 64 bit Mingw W64 官网 一个教程 MSYS2 是一个 w
  • CMake GUI工具使用 MinGW 64构建工程

    系列文章目录 文章目录 系列文章目录 前言 一 open Project是灰色 前言 CMake GUI 打开 CMake GUI 在 Where is the source code 字段中 选择 Krita 源代码目录 E krita
  • 给 MSYS2 添加中科大的源

    最近一段时间不知怎么的 使用默认的 MSYS2 源升级软件或是安装新软件的特别的慢 所以就翻了翻国内的几个开源软件的镜像库 发现中科大的库里就有 MSYS2 所以就研究了一下 给 MSYS2 添加了中科大的源 简单的说 msys64 etc
  • collect2.exe:错误:ld 返回 5 退出状态

    我最近更新了所有 msys2 软件包 现在无法构建我的项目 链接 dll 之一时发生错误 target library dll 我不清楚错误消息 状态5是什么意思 collect2 exe 错误 ld 返回 5 退出状态 完整消息 g Wl
  • MinGW/MSYS2 的非本地化版本?

    有没有办法用 gcc 下载未本地化的 MinGW MSYS2 如果系统语言不是英语 本地化 gcc 会导致 CodeBlocks 中的所有警告变成错误 此错误也在这里报告 http forums codeblocks org index p
  • Msys2:两个 python 安装中的 readline

    我将编辑放在最上面 因此读者不需要找到当前状态 这是与中提到的两个 python 安装相关的特定问题Msys2 维护两个 python 安装 pacman Sl grep python grep installed mingw64 ming
  • 配置 Eclipse 以与 MSYS2 一起使用

    我使用 Eclipse Mars 和 MSYS2 Eclipse 无法识别我的 MSYS2 安装 它包含用于 32 位编译的 Mingw w64 我在互联网上找到的东西不起作用 我应该怎么办 好吧 聚会有点晚了 但看起来还有没什么特别的关于
  • 为什么我的 32 位 Fortran/C DLL 无法在 MSYS2 中编译?

    我正在尝试在 MSYS2 中的 64 位 Windows 7 上编译具有混合 Fortran C 代码的 DLL msys2 x86 64 20160205 与海湾合作委员会 5 3 0 我想编译32位 如果我省略了 效果就很好 m32标志
  • libcurl -curl_easy_perform() 失败:SSL CA 证书有问题(路径?访问权限?)

    我在 Windows 7 x64 上使用 mingw64 MSYS2 从下面的链接编译了简单的 libcurl 示例程序 https curl se libcurl c simple html https curl se libcurl c
  • 从命令提示符或 PowerShell 调用 MSYS2 Shell

    从命令提示符或 PowerShell 开始 两者都可以 我可以弄清楚如何执行另一个给定的操作 如何调用 MSYS2 shell 来运行命令 更具体的问题 我包含此信息是为了避免 XY 问题 但我坚信最好通过回答上述 更一般的 问题来解决这个
  • 在 Windows 上运行 libxlsxwriter

    我正在尝试使用libxlsxwriter 但我似乎可以让事情正确编译或运行 我按照 Windows 的说明使用Mingw w64 and msys2可以在这里找到 http libxlsxwriter github io getting s
  • 在企业代理内的 Windows 中安装 Ruby 2.4.1。 MSYS2更新失败

    我正在使用 ruby 安装程序rubyinstaller 2 4 1 2 x64 exe https rubyinstaller org downloads archives 安装ruby 2 4 1 on windows 10 就成功了并
  • 更改 Windows 安装的 Git Bash 中 ~ 目录的位置

    我什至不确定我问的是正确的问题 让我解释一下我的情况 这是关于 Windows 7 上的 Git 我的公司在网络驱动器上设置 Windows 用户目录 而不是在本地硬盘驱动器上 用于备份和超出本问题范围的其他目的 我无法改变这项政策 然而
  • 如何在 Windows 7+ 和 MSYS2 上的 GTK3 上获取本机 Windows 装饰

    我正在尝试将我的应用程序从 Linux 移植到 Windows 但我遇到主题设置问题 在 Linux 中 这是开箱即用的 只需编译它 应用程序就会使用良好的主题并且看起来很原生 我已经在 MSYS2 中安装了 gtkmm3 和 gtk3 并

随机推荐