Linux

readlink -f 和 -e 選項說明不清楚

  • November 15, 2020
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
-e, --canonicalize-existing
canonicalize by following every symlink in every component of the given name recursively, all components must exist

我無法理解 -f 或 -e 的作用是什麼?措辭根本不清楚。規範名稱基本上是最短的唯一絕對路徑。但是名稱的組成部分是什麼意思?是子目錄的意思嗎?這裡的“遞歸”是什麼意思?我的理解是遞歸搜尋給定規範名稱的每個子目錄。但是對於符號連結來說沒有意義。

接下來,所有組件必須存在的“-e”選項意味著什麼?這裡的組件是什麼?

有人可以幫忙舉一個簡單的例子嗎?謝謝

這裡的第一個組件是指路徑的一個元素。例子 :

/home/user/.ssh => <component1>/<component2>/<component3>

1-假設我們有這樣的目錄結構:

lols
├── lol
├── lol1 -> lol
└── lol2 -> lol1

而且這裡不存在的目錄是lols/lol3 所以你可以比較每個命令的輸出:

readlink -f lols/lol1 : /lols/lol
readlink -e lols/lol1 : /lols/lol

此處的輸出將是相同的,因為路徑的所有組件都存在。

readlink -f lols/lol8 : lols/lol8
readlink -e lols/lol8 : <empty outpyt>

這裡的輸出是不同的,因為使用**-f它將顯示結果,因為至少在路徑中存在一個組件,即****lols並且使用-e輸出將為空,因為所有路徑組件都必須存在**。

最後一個是有多個不存在的目錄:

readlink -f lols/lol8/lol10 : <empty output>
readlink -e lols/lol8/lol10 : <empty output>

這裡的輸出將為空,因為如地圖頁面中所述: -f :除最後一個組件外的所有組件都必須存在 => 不尊重 -o :所有組件都必須存在 => 不尊重

2- 為什麼不只使用 ls -l :

假設我們創建一個名為 file1 的文件並創建指向該文件的 asymlink 名為 link1 並從 link1 創建另一個符號連結 link2 :

touch file1 : file1 
ln -s file1 link1 : link1 -> file1
ln -s link1 link2 : link2 -> link1

然後ls -l link2輸出將是:link2 -> link1 如果我們使用readlink link2輸出將是:link1; 與 ls -l 相同,但如果我們使用readlink -f|-e link2輸出將是:file1;所以它將指向文件。

那麼什麼時候使用readlink而不是ls呢?當有嵌套的符號連結時(遞歸讀取)。當文件/目錄位於不同位置時。

所以最好使用readlink而不是ls來避免錯誤。

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