我的系统是 macOS 13.2.1,shell 是 oh-my-zsh(bash 上的行为相同)。我在cd
命令中发现了一种奇怪的行为。它将当前目录更改为错误的目录。这不是软链接造成的,因为正确的路径中没有目录。
!w /Library/TeX/texbin ........................................................................................................... 14:56:24
> cd ../../texmf-dist
!w /usr/local/texlive/2021/texmf-dist ............................................................................................ 14:56:40
> cd -
/Library/TeX/texbin
!w /Library/TeX/texbin ........................................................................................................... 14:56:42
> cd ../../
!w /Library ...................................................................................................................... 14:56:51
> cd texmf-dist
cd: no such file or directory: texmf-dist
答案1
您提到的/Library/TeX
是 的符号链接/usr/local/texlive/2021/universal-darwin/
,这会导致歧义。
当您进入/Library/TeX/texbin
(really /usr/local/texlive/2021/universal-darwin/texbin
) 并运行时cd ../..
,shell 会查看是否/Library/texmf-dist
存在,也就是说,它会记住您用于访问那里的链接的路径,并为每个 删除一个路径元素..
,实际上撤消了所执行的步骤链接。你最终会进入/Library
.并且/Library/texmf-dist
不存在,所以最终cd
不起作用。
类似地,cd ../../texmf-dist
它会尝试去/Library/texmf-dist
但不存在。但在这里,它会检查该路径在您所在的实际位置是否有意义,而无需记住符号链接。确实如此,你最终会进入/usr/local/texlive/2021/texmf-dist
.请注意,由于 shell 必须通过符号链接忘记路径,因此路径如何完全改变。
如果您返回/Library/TeX/texbin
并运行cd -P ../..
,它会使用“物理”路径,再次忘记符号链接,并且您最终会进入/usr/local/texlive/2021
,在那里cd texmf-dist
将再次正常工作。
结构如下所示,差异来自于在..
from时选择的路径 up universal-darwin
(我假设其他目录都不是符号链接):
/Library -> Tex - - - -(symlink)- - +
v
/usr -> local -> texlive -> 2021 -> universal-darwin -> texbin
|
+---> texfmt-dist
shell 记住您使用的符号链接的方式是一种可用性功能,在许多情况下,这意味着您不需要记住某些东西实际在哪里,当您可以使用更好的名称创建符号链接并浏览它时。~/thingy
比/net/fileserver1/disk02/dir/thingy
什么都更容易记住。
但这意味着目录树不是树如果再多了,“向上”就变得含糊不清了。
因此,当“超过”符号链接目标时,它可能会崩溃。特别是从 shell 启动的程序不会知道 shell 记住了符号链接的内容,并且它们将始终使用“物理”父目录。例如,在您的情况下,作为/Library/TeX
符号链接,ls ..
在那里运行应该显示与cd ..; ls
.