【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风格
  • 在windows上安装配置msys2

    在windows上安装配置msys2 msys2安装启动msys2msys2中文乱码问题MSYS2 目录映射问题MSYS2 ln s软连接会复制目录的问题fastab配置文件目录的方法 msys2配置国内镜像源更新msys2安装git和vi
  • 如何使用 MSYS2 编译最新版的 coreutils 源码(目前最新版本为 coreutils-9.4)

    文章目录 一 coreutils 源码下载 二 MSYS2 安装编译工具 1 pacman Suy 更新软件仓库 2 pacman S msys gcc 安装gcc 3 pacman S msys make 安装make工具 4 解压缩 c
  • 使用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更换国内源

    今天安装了Msys64 但是Msys64使用的国外源实在太慢 必须更新为国内源 目前测试过国内最快是清华大学的源 我的安装路径为d msys64 为什么要安装在D盘 因为msys64需要不断更新数据和安装自己的软件 也就是说会占用越来越多的
  • MSYS2 Mingw Cygwin对比

    系列文章目录 文章目录 系列文章目录 前言 一 MSYS2 是什么 前言 Mingw 仅支持 32 bit 程序 现在一般用 Mingw w64 既支持 32 也支持 64 bit Mingw W64 官网 一个教程 MSYS2 是一个 w
  • windows下Meson构建系统

    系列文章目录 文章目录 系列文章目录 前言 find package Zug REQUIRED find package Zug REQUIRED 前言 在编译krita源码时需要构建 关于Meson的中文参考资料比较少 比较全面的是Mes
  • 简明阐述MinGW,MSYS,MSYS2

    几年前的一个项目连同环境 不小心被我从硬盘上不可恢复的删掉了 为了挽救 没头苍蝇似的在网上闯荡了几天 发现自己以前对MinGW的理解有着很大的误区 本文不是攻略 只是希望以更简洁 清晰的描述 来帮助大家理解MinGW 防止重蹈我的覆辙 一
  • collect2.exe:错误:ld 返回 5 退出状态

    我最近更新了所有 msys2 软件包 现在无法构建我的项目 链接 dll 之一时发生错误 target library dll 我不清楚错误消息 状态5是什么意思 collect2 exe 错误 ld 返回 5 退出状态 完整消息 g Wl
  • 如何将 mingw-w64 和 MSYS2 与 eclipse 或 codeblocks 等 IDE 一起使用?

    我安装 msys2here 我下载i686 5 3 0 release posix dwarf rt v4 rev0 from here 设置后msys2 i686 20160205 exe 提炼i686 5 3 0 release pos
  • MinGW/MSYS2 的非本地化版本?

    有没有办法用 gcc 下载未本地化的 MinGW MSYS2 如果系统语言不是英语 本地化 gcc 会导致 CodeBlocks 中的所有警告变成错误 此错误也在这里报告 http forums codeblocks org index p
  • 配置 Eclipse 以与 MSYS2 一起使用

    我使用 Eclipse Mars 和 MSYS2 Eclipse 无法识别我的 MSYS2 安装 它包含用于 32 位编译的 Mingw w64 我在互联网上找到的东西不起作用 我应该怎么办 好吧 聚会有点晚了 但看起来还有没什么特别的关于
  • 如何使用 Msys2 和 MinGW 在 Windows 上构建 OpenLDAP 库?

    我正在尝试在 Windows 上构建 OpenLDAP 我这样做非常困难 我开始按照概述的指示进行操作here http www openldap org faq data cache 302 html 但很快意识到它已经过时了 然后我发现
  • 如何强制 make 在 Windows/MSYS2 上使用 bash 作为 shell

    我正在尝试重新编译一个已经有 Windows 端口的应用程序 所以它应该可以工作 当然 你还需要运行 configure所以你需要 MSYS 或 MSYS2 配置部分运行良好 现在当我跑步时make n 所以它显示执行了哪些规则 我得到 m
  • 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
  • 安装 Sass 时出错(Ruby 2.5.0.1、MSYS2 20161025.0.0)

    我尝试安装 Sass 我安装了Ruby and MSYS2在此之前 来自所有人的最新消息巧克力味 https chocolatey org choco install ruby choco install msys2 看来它们已正确安装 r
  • 在企业代理内的 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 就成功了并

随机推荐