Linux
readlink -f 和 -e 選項說明不清楚
-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來避免錯誤。