如何解释 macOS 上奇怪的 cd 行为?

如何解释 macOS 上奇怪的 cd 行为?

我的系统是 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.

相关内容