我很想知道谁在处理cygwin中的路径。
例如,如果我执行以下操作,则可以:
cd C:\
然而,当我这样做时:
$ pwd
/cygdrive/c
谁对这里的差异负责? 我很好奇的原因是" cd C:"其他工具之间接受Windows路径,但是当它们显示它们时,它们会显示不同的东西。
如果我在我的路径中包含cygwin bin文件夹(在常规cmd下),那么我知道它在cmd中都有效,那么导致这种转换的是什么呢,它是bash / shell吗?
答案 0 :(得分:2)
我很想知道谁在处理cygwin中的路径。
很大程度上,winsup/cygwin/path.cc
中的一小部分C ++代码。一个特别重要的功能是normalize_posix_path
。此代码最终编译在DLL cygwin1.dll
中,并由所有Cygwin应用程序使用。
Cygwin中的所有路径都是" POSIX"由Cygwin DLL本身解析的路径。 normalize_posix_path
函数识别路径中存在某些语法(驱动器号和反斜杠),并安排将它们视为" Win32路径"。
这就是为什么你可以将c:/Users/...
提供给Cygwin程序,作为/cygdrive/c/Users/...
的替代方案。
$ pwd
/cygdrive/c
这是如何工作的,Cygwin维护一个原生的Win32当前工作目录,因此它非常清楚这是C:\
。但是,此本机信息将向后映射到POSIX路径。 Cygwin通过扫描其挂载表来执行此操作,在挂载表中看到C:\
已安装"为/cygdrive/c
。 (pwd
实用程序只是报告Cygwin的POSIX getcwd
函数的实现正在返回。向后映射发生在该函数内部)。请注意,由于Cygwin在其挂载表创建的虚拟POSIX命名空间中运行,因此该空间包含没有Win32本机对应项的抽象位置。例如,您可以cd
到/dev
目录,其中包含tty
等条目。这没有本机位置,因此getcwd
将仅报告POSIX路径。当有一个corespondence时,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开始)。这是因为冒号后面没有目录分隔符(反斜杠或斜杠)。