当我在符号链接目录中时,为什么“ls ..”会显示真正的父内容?

daV*_*aVe 5 linux

$ cd ~
$ ln -s /real/folder symbolic_link

$ cd symbolic_link
$ cd ..
$ ls -l
symbolic_link -> /real/folder/

$ cd symbolic_link
$ ls -l ..
folder
Run Code Online (Sandbox Code Playgroud)

换句话说,为什么 的行为与您在符号链接目录中时的行为cd ..不同ls ..

Kam*_*ski 5

您的 shell 会跟踪引导您进入当前工作目录的符号链接。cd是一个内置的 shell 并help cd指出(来自 的示例bash):

选项:
-L强制遵循符号链接:在处理..
-P使用物理目录结构的实例后解析 DIR 中的符号链接而不遵循符号链接:在处理..
[...]
的实例之前解析 DIR 中的符号链接默认是遵循符号链接,就像-L被指定。

你可以试试看cd -P ..区别。另一个例子是pwd -Land pwd -P(whilepwd也是一个内置的 shell)。

请注意,可以通过set -P和更改默认行为set +P。有关help set更多详细信息,请参阅。

另一方面ls是一个单独的可执行文件,它不会从你的 shell 的这种跟踪能力中受益。但是,您可以使用此技巧使其遵循符号链接:

(cd -L .. && ls -l)
Run Code Online (Sandbox Code Playgroud)

基本上我们cd用来更改与符号链接相关的当前工作目录(我明确使用了默认-L选项),然后调用ls -l. 这&&操作装置ls只有将执行cd成功。括号()使里面的所有内容都在子shell中执行。这就是诀窍:cd命令只影响这个子shell,在你的主shell中没有任何变化,不需要cd返回。

  • 感谢您帮助我理解 shell 内置命令和 Linux 工具之间的区别! (2认同)