首頁>Program>source

考虑到绝對或相對路徑(在類Unix系統中),我想在解決任何中間符號鏈接後確定目標的完整路徑.同時解決〜username表示法的奖励點。

如果目標是目錄,則可以將chdir()进入目錄,然後呼叫getcwd(),但我真的很想从shell指令碼中執行此操作,而不是編寫C帮助程式.不幸的是,shell倾向於尝試向使用者隱藏符號鏈接的存在(這在OS X上是bash):

$ ls -ld foo bar
drwxr-xr-x   2 greg  greg  68 Aug 11 22:36 bar
lrwxr-xr-x   1 greg  greg   3 Aug 11 22:36 foo -> bar
$ cd foo
$ pwd
/Users/greg/tmp/foo
$

我想要的是一个resolve()函式,以便在上例中的tmp目錄中執行時,resolve(" foo")==" / Users / greg / tmp / bar"。

最新回復
  • 5月前
    1 #

    < p>根据標準, pwd -P 應该返迴符號鏈接已解決的路徑。

    C函式 char *getcwd(char *buf, size_t size) 来自 unistd.h 應该具有相同的行為。

    getcwd pwd

  • 5月前
    2 #

    readlink -f "$path"
    

    編者註:以上內容適用於GNU readlinkFreeBSD / PC-BSD / OpenBSD readlink ,但从OS X 10.11開始,不是
    GNU readlink 提供其他相關選項,例如 -m 解決符號鏈接是否存在最终目標。

    請註意,自GNU coreutils 8.15(2012-01-06)起,有一个 realpath 可用的程式比上述方法更簡單,更靈活.它也与同名的FreeBSD util相容.它還具有在两个檔案之間生成相對路徑的功能。

    realpath $path
    

    [下面的管理員補充来自halloleo —danorton的評論]

    對於Mac OS X(至少通過10.11.x版),請使用 readlink 没有 -f 選項:

    readlink $path
    

    編者註:這不会遞迴地解析符號鏈接,因此不会報告最终目標; 例如,给定symlink a 指向 b ,依次指向 c ,這只会報告 b (並且不能確保將其輸出為绝對路徑)。
    使用以下 perl OS X上的命令以填補缺少的 readlink -f的空白 功能:
    perl -MCwd -le 'print Cwd::abs_path(shift)' "$path"

  • 5月前
    3 #

    " pwd -P"似乎只需要目錄,但由於某些原因想要實際可執行檔案的名稱,我认為這没有帮助.這是我的解決方案:

    #!/bin/bash
    # get the absolute path of the executable
    SELF_PATH=$(cd -P -- "$(dirname -- "$0")" && pwd -P) && SELF_PATH=$SELF_PATH/$(basename -- "$0")
    # resolve symlinks
    while [[ -h $SELF_PATH ]]; do
        # 1) cd to directory of the symlink
        # 2) cd to the directory of where the symlink points
        # 3) get the pwd
        # 4) append the basename
        DIR=$(dirname -- "$SELF_PATH")
        SYM=$(readlink "$SELF_PATH")
        SELF_PATH=$(cd "$DIR" && cd "$(dirname -- "$SYM")" && pwd)/$(basename -- "$SYM")
    done
    

  • 5月前
    4 #

    我的最爱之一是 realpath foo

     realpath-返迴規範化的绝對​​路徑名
     realpath擴充套件所有符號鏈接,並解析路徑和名稱所指向的空终止字元串中對" /./"、"/../"和其他" /"字元的引用。
        將規範化的绝對​​路徑名儲存在由resolve_path命名的PATH_MAX大小的緩衝區中.結果路徑將没有符號鏈接" /./"或
        '/../' 元件。
    

  • 5月前
    5 #

    readlink -e [filepath]
    

    似乎恰恰是您要的 -接受路徑,解析所有符號鏈接,並返迴"真實"路徑 -可能所有系統都已经拥有了"標準* nix"

  • 如何在bash shell中將一个字元串拆分為多个字元串,並用至少一个空格分隔?
  • jquery:Intellisense在Visual Studio 2012中不適用於JavaScript