Jump to...
redirecting...

Log for Ubuntu 台灣社群

看了這篇後,好像有多了解一些,但仍不太確定manpage放這句的用意:
https://unix.stackexchange.com/questions/105637/is-symlinks-target-relative-to-the-destinations-parent-directory-and-if-so-wh
1. Resolve symlink的意思
在ln指令的內部處理,似乎不會去檢查symlink target的有效性(resolve & validate symlink)
例如:
[me@ArchLinux-CB project]$ ls -l
total 12
drwxr-xr-x 2 me users 4096 Mar  6 23:26 build
drwxr-xr-x 2 me users 4096 Mar  6 23:09 src1
drwxr-xr-x 2 me users 4096 Mar  6 23:16 src2

1.1 假設需求是要在build目錄下,新增symlink src1->../src1,一般做法(至少我以前只知道這個方式):
[me@ArchLinux-CB project]$ cd build
[me@ArchLinux-CB build]$ ln -s ../src1 src1
[me@ArchLinux-CB build]$ ls -l
total 0
lrwxrwxrwx 1 me users 7 Mar  6 23:30 src1 -> ../src1

1.2 但其實,不進到build目錄下,一樣能做,以再新增symlink src2->../src2為例:
[me@ArchLinux-CB project]$ ls -l
total 12
drwxr-xr-x 2 me users 4096 Mar  6 23:30 build
drwxr-xr-x 2 me users 4096 Mar  6 23:09 src1
drwxr-xr-x 2 me users 4096 Mar  6 23:16 src2
[me@ArchLinux-CB project]$ ls -l build/
total 0
lrwxrwxrwx 1 me users 7 Mar  6 23:30 src1 -> ../src1
[me@ArchLinux-CB project]$ ln -s ../src2 build/src2
[me@ArchLinux-CB project]$ ls -l build
total 0
lrwxrwxrwx 1 me users 7 Mar  6 23:30 src1 -> ../src1
lrwxrwxrwx 1 me users 7 Mar  6 23:33 src2 -> ../src2
神奇了,在project目錄下,"ln -s ../src2 build/src2",事實上../src2這個target是不存在的。

1.3 推測,ln指令內部,並不會去做resolve & validate symlink target的動作。
2. 將三者加起來 (1)manpage (2)stackoverflow那個問題的第二篇回應 (3)以上測試

(1)
Symbolic links can hold arbitrary text; if later resolved, a relative link is interpreted in relation to its parent directory.

(2)
As to the why of it, imagine if the symlink were instead interpreted relative to its source rather than its destination. When later resolving it, you would need to know what your CWD was when you created it, which is nonsensical, let alone impossible.

個人的解讀:
- "if later resolved" 表示resolve symlink是在要讀取時才會發生,而不是在前面執行ln的階段。
- "a relative link is interpreted in relation to its parent directory" (假設relative link是以 "../" 開頭的symlink),則表示resolve階段是與symlink所在目錄有關,而與執行ln指令執行時所在目錄(CWD)無關 (因為也無法知道當時的CWD了)。

個人感想: "a relative..." 那段,如果只看字面意思,好像有點廢話(就是因為相對於parent dir,所以才叫relative link吧...有什麼好講的),感覺要表達的重點,反而是沒講出來的部分?

當然,以上屬個人推測,不確定是否符合manpage作者的原意。
好完整!
sorry, 原本有想用三個backtick去quote,web版看正常,手機版好像沒成功?
1. 符號連結就跟 Windows 的捷徑一樣,不一定目標位置要有東西
1.3. 的確,不會檢查。但 Hard link 實際連結目標就必須有東西。
@PeterDaveHello 大佬居然還沒睡!嗨嗨:)
我一介路人 ...
GNU 工具的核心開發者似乎是將使用者預設都了解系統內部的運作機制。
要翻 coreutils 得要先把 Linux 弄熟啊! orz
不,你是我的偶像!(?
寫的其實很完整詳盡!
1.3有補充到我以前不知的,但我對manpage放那句的用意,還是有點跟不到重點的感覺...
寫信問開發者吧,畢竟這的確有點複雜。
大部分開發者都很樂意回答這種問題的
其實他要強調的是: ln -s ../../aa/bb ../jj/l 這樣的命令,前面的 ../../aa/bb 不是以現在的環境解析的(所以 ln 程式沒有真正解析它),而是以 ../jj 為基礎來解析(所以要等到有程式嘗試存取 ../jj/l 的時候,才由作業系統解析)
我悟性太低了啦 XD
原來要強調的重點,不是寫出來的句子,而是要領悟出沒出現的句子,進一步去做對比...
sub commands: help, add, append, remove, list, search, show, ignoreChannel, unignoreChannel, listIgnoreChannel run sub command with / bind [subcommand] show help message of sub commands by / bind help [subcommand] show current message with / bind help