Symlink

符號連結的目標是否相對於目標的父目錄,如果是,為什麼?

  • November 3, 2018

我有以下文件結構:

build/
client/
 –> index.js

當我嘗試在建構目錄中創建一個名為“client”的符號連結時,它引用 cwd 中的客戶端目錄,如下所示

// Fails
$ pwd
/home/user/
$ ln -s client build/client 
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links

我收到上面顯示的 ELOOP 錯誤。當我將目標路徑更改為相對於目標路徑時,一切都很好:

// Works
$ pwd
/home/user/
$ ln -s ../client build/client 
$ stat build/client/index.js
stat: <outputs file stats>

這是預期的行為嗎,請解釋原因…

對於不起作用的那個,如果我們查看ls -l結果,我們會得到以下資訊:

[sparticvs@sparta test]$ ls -l build/
total 0
lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client

現在要了解這裡發生了什麼。讓我們看看你呼叫的命令:

ln -s client build/client

根據手冊頁,這種格式有兩種可能的匹配項

SYNOPSIS
      ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
      ln [OPTION]... TARGET... DIRECTORY     (3rd form)

它將匹配第一個表單(從第一個表單開始)。現在,“目標名稱”或client在您的情況下,可以是(根據完整的ln手冊)任意字元串。他們不必現在解決任何事情,但可以解決未來的事情。您通過呼叫創建的是“懸空符號連結”,系統不會阻止您創建這些。

現在您的第二次呼叫ln -s ../client build/client是所謂的“相對符號連結”(正如您在自己的文章中指出的那樣)。還有第二種類型,那就是“絕對符號連結”,可以通過呼叫來呼叫 do ln -s /home/user/client build/client

不是錯誤。根據手冊,它指出:

在與目前目錄不同的位置創建相對符號連結時,符號連結的解析度將不同於目前目錄中相同字元串的解析度。因此,許多使用者喜歡首先將目錄更改為將創建相對符號連結的位置,以便製表符補全或其他文件解析將找到與將放置在符號連結中的目標相同的目標。

  • info coreutils 'ln invocation'

也就是說,您必須使用目標的相對或絕對路徑。

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