谁处理 Cygwin 中的路径

Who handles the paths in Cygwin

我很想知道谁在 cygwin 中处理路径。

例如,如果我执行以下操作,它会起作用:

cd C:\

然而当我这样做时:

$ pwd
/cygdrive/c

谁对这里的差异负责? 我很好奇的原因是 "cd C:" 在其他工具中接受 windows 路径但是在显示它们时它们显示出不同的东西。

如果我在我的路径中包含 cygwin bin 文件夹(在常规 cmd 下),那么我知道它在 cmd 中一切正常,那么是什么导致了这种转换,是 bash/shell 吗?

I am curious to find out who handles the paths in cygwin.

winsup/cygwin/path.cc 中的大部分 C++ 代码。一个特别重要的函数是normalize_posix_path。此代码最终编译在所有 Cygwin 应用程序使用的 DLL cygwin1.dll 中。

Cygwin 中的所有路径都是由 Cygwin DLL 本身解析的“POSIX”路径。 normalize_posix_path 函数识别路径中某些语法的存在(驱动器号和反斜杠),并将它们安排为“Win32 路径”。

这就是为什么您可以将 c:/Users/... 提供给 Cygwin 程序,作为 /cygdrive/c/Users/... 的替代方案。

$ pwd

/cygdrive/c

Cygwin 的工作原理是维护一个本地 Win32 当前工作目录,因此它非常清楚这是 C:\。但是,此本机信息会向后映射到 POSIX 路径。 Cygwin 通过扫描它的安装 table 来做到这一点,它看到 C:\ 被“安装”为 /cygdrive/c。 (pwd 实用程序只是报告 Cygwin 对 POSIX getcwd 函数的实现返回的内容。向后映射发生在该函数内部)。请注意,由于 Cygwin 在其挂载 table 创建的虚拟 POSIX 名称space 中运行,因此 space 包含没有 Win32 本机对应项的抽象位置。例如,您可以 cd/dev 目录,其中有像 tty 这样的条目。它没有本地位置,因此 getcwd 将只报告 POSIX 路径。当有对应时,Cygwin 会尝试使 Cygwin 内部当前工作目录与 Win32 目录保持同步;它没有使用 SetCurrentDirectory Win32 函数,也没有维护 Windows 驱动器具有单独的当前工作目录的概念。

If I do include the cygwin bin folder in my path (under regular cmd) then I know it all works as in cmd, so what is it thats causing this convertion, is it the 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 开始)。这是因为冒号后面没有目录分隔符(反斜杠或斜杠)。