神秘的軟連結

Undefined443發表於2024-06-09

某次我注意到如下軟連結:

$ pwd
/Library/TeX/texbin
$ ls -l
lrwxrwxrwx 1 root    41 Mar 16 16:20 tlmgr -> ../../texmf-dist/scripts/texlive/tlmgr.pl

我非常奇怪,因為當前目錄是 /Library/TeX/texbin,而 tlmgr 的軟連結指向 ../../texmf-dist/scripts/texlive/tlmgr.pl,也就是說它應該指向 /Library/texmf-dist/scripts/texlive/tlmgr.pl,但是 Library 目錄中並沒有 texmf-dist 這個資料夾。

我嘗試執行如下命令:

$ pwd
/Library/TeX/texbin
$ cd ../../texmf-dist
$ pwd
/usr/local/texlive/2024/texmf-dist

發現竟然直接跳到了另一個目錄。然而如果我分開跳轉:

$ pwd
/Library/TeX/texbin
$ cd ../..
$ cd texmf-dist
cd: no such file or directory: texmf-dist

我百思不得姐。問了 ChatGPT,ChatGPT 說是因為我當前在的這個 texbin 目錄本身就是一個軟連結,指向另一個目錄。cd ../../texmf-dist 相當於直接在另一個目錄中跳轉。而 cd ../.. && cd texmf-dist 則是退出了軟連結之後再進行跳轉,因此跳轉失敗。

經過查詢,我發現 texbin 確實是一個軟連結:

$ ls -l
lrwxr-xr-x 1 root  29 May 13 12:00 texbin -> Distributions/Programs/texbin

可是 tlmgr 的軟連結指向的是 ../../texmf-dist/scripts/texlive/tlmgr.pl,從 Distributions/Programs/texbin 目錄依然無法跳轉到 texmf-dist 目錄。

於是我又查了一下 Distributions/Programs/texbin 目錄,發現它也是一個軟連結:

$ ls -l Distributions/Programs/texbin
lrwxr-xr-x 1 root 39 May 13 12:00 Distributions/Programs/texbin -> ../.DefaultTeX/Contents/Programs/texbin

我繼續往下查:

$ ls -l Distributions/Programs/../.DefaultTeX/Contents/Programs/texbin
lrwxr-xr-x 1 root 9 May 13 12:00 Distributions/Programs/../.DefaultTeX/Contents/Programs/texbin -> universal
$ ls -l Distributions/Programs/../.DefaultTeX/Contents/Programs/universal
lrwxr-xr-x 1 root 64 May 13 12:00 Distributions/Programs/../.DefaultTeX/Contents/Programs/universal -> ../../../../../../../usr/local/texlive/2024/bin/universal-darwin
ls -ld Distributions/Programs/../.DefaultTeX/Contents/Programs/../../../../../../../usr/local/texlive/2024/bin/universal-darwin
drwxr-xr-x 495 root 15840 Mar 16 16:21 Distributions/Programs/../.DefaultTeX/Contents/Programs/../../../../../../../usr/local/texlive/2024/bin/universal-darwin

這下終於找到真身了。有點亂,整理一下:

graph TD A[ /Library/TeX/texbin ] --> B[ /Library/TeX/Distributions/Programs/texbin ] B --> C[ /Library/TeX/Distributions/.DefaultTeX/Contents/Programs/texbin ] C --> D[ /Library/TeX/Distributions/.DefaultTeX/Contents/Programs/universal ] D --> E[ /usr/local/texlive/2024/bin/universal-darwin ]

/usr/local/texlive/2024/bin/universal-darwin 就是我們最終進入的目錄。

而其中的 tlmgr 指向的 ../../texmf-dist/scripts/texlive/tlmgr.pl,我們也可以正常找到它的位置,位於 /usr/local/texlive/2024/texmf-dist/scripts/texlive/tlmgr.pl,這符合我們的預期。

雖然進入 /Library/TeX/texbin 目錄就相當於進入 /usr/local/texlive/2024/bin/universal-darwin 目錄,然而當我們使用 pwd 列印當前工作目錄時,Shell 並不會告訴我們這一點。Shell 會讓我們以為我們就處於 /Library/TeX/texbin 目錄(畢竟你進入 .. 目錄的話還要退出軟連結不是)。

相關文章