2016-01-20 86 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)。這是因爲冒號後面沒有目錄分隔符(反斜槓或斜槓)。