[英]Always get path starting /cygdrive from cygpath?
在Cygwin上, cygpath
應用程序在Windows和Unix樣式的路徑之間轉換。
考慮以下示例:
$ cygpath -u "c:/"
/cygdrive/c
$ cygpath -u "c:/cygwin64/bin"
/usr/bin
有什么方法可以從第二個命令獲取/cygdrive/c/cygwin64/bin
?
我需要這樣做,是因為有時Cygwin對其根的位置感到困惑,因此我想要一個絕對路徑以便清楚。
不,Cygwin的cygpath
不支持此功能。 您能做的最好的就是使用自己的轉換工具手動對其進行修復。 類似於以下內容:
#!/usr/bin/env bash
if [[ "$1" == -z ]]; then
# Invoked with -z, so skip normal cygpath processing and convert the path
# here.
#
# The sed command replaces "c:" with "/cygdrive/c", and switches any
# back slashes to forward slashes.
shift
printf "%s\n" "$*" | sed -r 's!(.):([\\\/].*)$!/cygdrive/\1\2!;s!\\!/!g'
else
# Not invoked with -z, so just call cygpath with the arguments this script
# was called with.
exec cygpath "$@"
fi
如果將上面的腳本存儲為mycygpath.sh
則它的行為將與cygpath
完全相同,除非為它提供-z
參數,在這種情況下,它將簡單地將n:/
轉換為/cygdrive/n/
:
$ ./mycygpath.sh -u "c:/"
/cygdrive/c
$ ./mycygpath.sh -u "c:/cygwin64/bin"
/usr/bin
$ ./mycygpath.sh -z "c:/cygwin64/bin"
/cygdrive/c/cygwin64/bin
當然,存在一個顯而易見的問題, 為什么 “ Cygwin對它的根源感到困惑”; 為什么 ? 這根本不應該發生,這意味着您的Cygwin設置有問題。 但這不是您提出的問題,您沒有提供足夠的詳細信息以開始提出建議。
另一個解決方案很丑陋,但可行的是,在cygwin根路徑和傳遞的路徑中使用不同的字母大小寫。 您可以在/etc/mtab
文件或mount
命令的輸出中檢查cygwin根目錄。
例如,如果您的cygwin64根目錄為C:/cygwin64
, C:/cygwin64
路徑作為C:/Cygwin64/bin
傳遞。
對於我的設置:
cygpath -ud:/programs/cygwin64/bin
給出了/usr/bin
。 cygpath -ud:/Programs/cygwin64/bin
給出了/cygdrive/d/Programs/cygwin64/bin
。 顯然,cygwin(或cygpath)對路徑前綴進行區分大小寫的比較,並且當您更改大小寫時,它會失敗,並且前綴也不會更改,並且您會獲得完整路徑。
在以前的版本中,有一些關於編輯/etc/mtab
(這是不可能的,或者,如果可能的話,是完全錯誤的)或/etc/fstab
(可以的,但不適用於根文件系統)的一些想法。 不要那樣做
Cygwin通過首先查看cygwin1.dll
的路徑來初始化其根,然后-在注冊表中(例如,所考慮的注冊表項之一是HKEY_LOCAL_MACHINE\\SOFTWARE\\Cygwin\\setup
)。 注冊表項發生了一件奇怪的事情:每次加載cygwin dll時都會對其進行更新,而從cygwin發行版的不同二進制文件中使用不同的參數加載cygwin1.dll時,會以不同的情況進行更新。 例如,
d:\\programs\\cygwin64\\bin\\ls.exe
,該值變為\\??\\d:\\programs\\cygwin64
, d:\\Programs\\cygwin64\\bin\\ls.exe
給出\\??\\d:\\Programs\\cygwin64
, d:\\programs\\cygwin64\\bin\\cygcheck.exe
\\??\\d:\\programs\\cygwin64
, d:\\Programs\\cygwin64\\bin\\cygcheck.exe
\\??\\d:\\Programs\\cygwin64
, 但:
d:\\programs\\cygwin64\\bin\\cygcheck.exe -s
給出\\??\\D:\\programs\\cygwin64
, d:\\Programs\\cygwin64\\bin\\cygcheck.exe -s
給出\\??\\D:\\programs\\cygwin64
, 根掛載點的d:\\Programs\\cygwin64\\bin\\mount.exe
輸出始終為(無論大小寫) D:/programs/cygwin64 on / type ntfs (binary)
。
當cygwin1.dll使用不同(區分大小寫)的路徑加載時,我期望有不同的安裝點,因此對於d:\\Programs\\cygwin64\\bin\\mount.exe
其根目錄為d:/Programs/cygwin64
,對於d:\\programs\\cygwin64\\bin\\mount.exe
,它將是d:/programs/cygwin64
。 不確定這種不一致有什么問題(如果有的話),仍在調查中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.