谁在Cygwin处理路径

时间:2016-01-20 09:59:12

标签: cygwin cygpath

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

例如,如果我执行以下操作,则可以:

cd C:\

然而,当我这样做时:

$ pwd
/cygdrive/c

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

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

1 个答案:

答案 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开始)。这是因为冒号后面没有目录分隔符(反斜杠或斜杠)。

相关问题