神秘的软链接

某次我注意到如下软链接:

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

我非常奇怪,因为当前目录是 /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 目录(毕竟你进入 .. 目录的话还要退出软链接不是)。

posted @ 2024-06-09 02:08  Undefined443  阅读(3)  评论(0编辑  收藏  举报