Coreutils

Coreutils realpath:與硬(?)連結一起使用時會混淆輸出

  • July 19, 2017

我在“玩耍”並且搞砸了我的 pip (Python 包管理器)安裝。無論如何,事實證明,在我的系統/bin/pip中是(?)一個硬連結/usr/bin/pip(或相反,因為我被告知硬連結沒有哪個文件是原始文件的概念)。

$ realpath /bin/pip /usr/bin/pip
/usr/bin/pip
/usr/bin/pip

結果realpath讓我很困惑。如果不知道哪個文件是原始文件,為什麼realpathdisplay/usr/bin/pip而不是/bin/pipfor /bin/pip

我知道兩者都可能是硬連結,因為:

$ stat -c "%n is a %F pointing to inode %i, which has %h hard link(s)" /bin/pip /usr/bin/pip
/bin/pip is a regular file pointing to inode 152837, which has 1 hard link(s)
/usr/bin/pip is a regular file pointing to inode 152837, which has 1 hard link(s)

以防萬一,我的機器執行的是 CentOS 7,而我的 realpath 命令來自 GNU coreutils 8.22。

        • 編輯 - - - -

實際上,/bin 是指向 /usr/bin 的符號連結,而 /usr/bin 是正常目錄:

$ ls -ld /bin /usr/bin
lrwxrwxrwx. 1 root root     7 May 15 12:49 /bin -> usr/bin
dr-xr-xr-x. 2 root root 53248 Jul 13 18:44 /usr/bin

我已經對此進行了測試,但它不會發生在我身上。我會懷疑(如建議的那樣)這是由於某處的符號連結,因為realpath解決了這些問題。

嘗試:

ls -li /bin/pip /usr/bin/pip  

這應該仔細檢查兩個目錄條目是否引用了相同的 inode/文件(直接或間接)。

現在嘗試:

ls -ld /bin /usr/bin  

那應該顯示兩個目錄(d在第一列中)。如果其中一個(幾乎可以肯定在該列中/usr/bin顯示一個l,那麼它是一個符號連結,這將解釋您所看到的行為(如前所述,realpath解析符號連結)。

最後澄清:如果其中一個/binor/usr/bin是到另一個的符號連結,realpath則將跟隨符號連結到其目標,並且它將使用該目標作為真實路徑。

GNU realpath(但不是所有其他的)可以--no-symlinks選擇;如果你使用它,你可能會得到你最初期望的結果。

引用自:https://unix.stackexchange.com/questions/379614