簡體   English   中英

總是從cygpath獲取以/ cygdrive開頭的路徑嗎?

[英]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:/cygwin64C:/cygwin64路徑作為C:/Cygwin64/bin傳遞。

對於我的設置:

  • cygpath -ud:/programs/cygwin64/bin給出了/usr/bin
  • cygpath -ud:/Programs/cygwin64/bin給出了/cygdrive/d/Programs/cygwin64/bin

顯然,cygwin(或cygpath)對路徑前綴進行區分大小寫的比較,並且當您更改大小寫時,它會失敗,並且前綴也不會更改,並且您會獲得完整路徑。

更新(15/07/2017)

在以前的版本中,有一些關於編輯/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM