1

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

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

cd C:\

但是,当我这样做时:

$ pwd
/cygdrive/c

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

如果我确实在我的路径中包含了 cygwin bin 文件夹(在常规 cmd 下),那么我知道它在 cmd 中都可以正常工作,那么导致这种转换的原因是什么,是 bash/shell 吗?

4

1 回答 1

2

我很想知道谁处理 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 的工作目录保持同步;它这样做没有使用SetCurrentDirectoryWin32 功能,也没有维护 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 开始)。这是因为冒号后面没有目录分隔符(反斜杠或斜杠)。

于 2016-07-17T14:41:34.487 回答