Coreutils
Coreutils realpath:與硬(?)連結一起使用時會混淆輸出
我在“玩耍”並且搞砸了我的 pip (Python 包管理器)安裝。無論如何,事實證明,在我的系統
/bin/pip
中是(?)一個硬連結/usr/bin/pip
(或相反,因為我被告知硬連結沒有哪個文件是原始文件的概念)。$ realpath /bin/pip /usr/bin/pip /usr/bin/pip /usr/bin/pip
結果
realpath
讓我很困惑。如果不知道哪個文件是原始文件,為什麼realpath
display/usr/bin/pip
而不是/bin/pip
for/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
解析符號連結)。最後澄清:如果其中一個
/bin
or/usr/bin
是到另一個的符號連結,realpath
則將跟隨符號連結到其目標,並且它將使用該目標作為真實路徑。GNU
realpath
(但不是所有其他的)可以--no-symlinks
選擇;如果你使用它,你可能會得到你最初期望的結果。