2016-01-20 133 views
1

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

举例来说,如果我这样做,它的工作原理:

cd C:\ 

然而,当我这样做:

$ pwd 
/cygdrive/c 

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

如果我在我的路径中包含cygwin bin文件夹(在常规cmd下),那么我知道这一切都在cmd中工作,那么它是什么造成这种转换,它是bash/shell?

+0

Cygwin的“root”被设置为'/ cygdrive',所以你指定的任何东西都是相对于这个根的。 –

+0

所以,如果我将这个根改为C:路径的行为就像在Windows中一样? – Har

+1

我怀疑Cygwin会让你改变这一点,但如果你改变了安装位置,它可能会工作。 –

回答

1

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

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

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

这就是为什么您可以将c:/Users/...作为/cygdrive/c/Users/...的备选方案提供给Cygwin程序的原因。

$ pwd

/cygdrive/c

这是如何工作的是Cygwin的保持了原生的Win32当前工作目录,因此它知道得很清楚,这是C:\。但是,这些本地信息被反向映射到POSIX路径。 Cygwin通过扫描其挂载表来查看C:\“挂载”为/cygdrive/c。 (pwd实用程序仅报告Cygwin实现的POSIX getcwd函数正在返回,向后映射发生在该函数内部)。请注意,由于Cygwin在由其挂载表创建的虚拟POSIX命名空间中运行,该空间包含没有Win32本机对象的抽象地点。例如,您可以从cd/dev目录,在此目录中您有像tty这样的条目。这没有本地位置,所以getcwd只会报告POSIX路径。 Cygwin会尝试保持Cygwin内部当前工作目录与Win32同步,当有内核时;它在不使用Win32函数的情况下完成,并且不需要维护Windows驱动器具有单独的当前工作目录的概念。

如果我做包括在我的道路cygwin的bin文件夹(在常规CMD),那么我知道这一切作品在cmd中,所以它是什么那造成这种皈依,是它在bash /壳?

事实上,它确实作为一切工作的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)。这是因为冒号后面没有目录分隔符(反斜杠或斜杠)。