我很想知道誰在cygwin中處理路徑。誰在Cygwin處理路徑
舉例來說,如果我這樣做,它的工作原理:
cd C:\
然而,當我這樣做:
$ pwd
/cygdrive/c
誰負責這裏的差異? 我很好奇的原因是「cd C:」之間的其他工具接受Windows路徑,但是當顯示它們時,它們顯示出不同的東西。
如果我在我的路徑中包含cygwin bin文件夾(在常規cmd下),那麼我知道這一切都在cmd中工作,那麼它是什麼造成這種轉換,它是bash/shell?
我很想知道誰在cygwin中處理路徑。誰在Cygwin處理路徑
舉例來說,如果我這樣做,它的工作原理:
cd C:\
然而,當我這樣做:
$ pwd
/cygdrive/c
誰負責這裏的差異? 我很好奇的原因是「cd C:」之間的其他工具接受Windows路徑,但是當顯示它們時,它們顯示出不同的東西。
如果我在我的路徑中包含cygwin bin文件夾(在常規cmd下),那麼我知道這一切都在cmd中工作,那麼它是什麼造成這種轉換,它是bash/shell?
我很想知道誰在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)。這是因爲冒號後面沒有目錄分隔符(反斜槓或斜槓)。
Cygwin的「root」被設置爲'/ cygdrive',所以你指定的任何東西都是相對於這個根的。 –
所以,如果我將這個根改爲C:路徑的行爲就像在Windows中一樣? – Har
我懷疑Cygwin會讓你改變這一點,但如果你改變了安裝位置,它可能會工作。 –