我很想知道谁处理 cygwin 中的路径。
例如,如果我执行以下操作,它会起作用:
cd C:\
但是,当我这样做时:
$ pwd
/cygdrive/c
谁对这里的差异负责?我很好奇的原因是“cd C:”在其他工具中接受 Windows 路径,但是在显示它们时它们会显示一些不同的东西。
如果我确实在我的路径中包含了 cygwin bin 文件夹(在常规 cmd 下),那么我知道它在 cmd 中都可以正常工作,那么导致这种转换的原因是什么,是 bash/shell 吗?
我很想知道谁处理 cygwin 中的路径。
主要是winsup/cygwin/path.cc
. 一个特别重要的功能是normalize_posix_path
。这段代码最终编译在cygwin1.dll
所有 Cygwin 应用程序使用的 DLL 中。
Cygwin 中的所有路径都是由 Cygwin DLL 本身解析的“POSIX”路径。该normalize_posix_path
函数识别路径中某些语法(驱动器号名称和反斜杠)的存在,并将它们安排为“Win32 路径”。
这就是为什么您可以c:/Users/...
使用 Cygwin 程序作为/cygdrive/c/Users/...
.
$ pwd
/cygdrive/c
其工作原理是 Cygwin 维护一个本机 Win32 当前工作目录,因此它非常清楚这是C:\
. 但是,此本机信息被向后映射到 POSIX 路径。Cygwin 通过扫描它的挂载表来做到这一点,它看到C:\
“挂载”为/cygdrive/c
. (该pwd
实用程序仅报告 Cygwin 的 POSIXgetcwd
函数实现返回的内容。向后映射发生在该函数内部)。请注意,由于 Cygwin 在其挂载表创建的虚拟 POSIX 命名空间中运行,因此该空间包含没有 Win32 本机对应物的抽象位置。例如,您可以cd
访问/dev
您有条目的目录,例如tty
. 这没有本地位置,因此getcwd
只会报告 POSIX 路径。当有对应时,Cygwin 试图使 Cygwin 内部的当前工作目录与 Win32 的工作目录保持同步;它这样做没有使用SetCurrentDirectory
Win32 功能,也没有维护 Windows 驱动器具有单独的当前工作目录的概念。
如果我确实在我的路径中包含了 cygwin bin 文件夹(在常规 cmd 下),那么我知道它在 cmd 中都可以正常工作,那么导致这种转换的原因是什么,是 bash/shell 吗?
实际上,它并不都像cmd
! 尽管 Cygwin 程序理解“Win32-ish”路径,但支持并不完整。您可以将路径传递D:file.txt
给真正的本地 Windows 程序。它通过与驱动器关联的当前目录进行解析,该目录D
可能是D:\bob\documents
,在这种情况下,路径代表D:\bob\documents\file.txt
. 如果没有这样的目录,那么它代表D:\file.txt
. Cygwin 程序无法理解这种驱动器相关路径。事实上,D:file.txt
甚至不会被识别为驱动器号参考(从 Cygwin 2.5.2 开始)。这是因为冒号后面没有目录分隔符(反斜杠或斜杠)。