$ 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 ..
?
您的 shell 会跟踪引导您进入当前工作目录的符号链接。cd
是一个内置的 shell 并help cd
指出(来自 的示例bash
):
选项:
-L
强制遵循符号链接:在处理..
-P
使用物理目录结构的实例后解析 DIR 中的符号链接而不遵循符号链接:在处理..
[...]
的实例之前解析 DIR 中的符号链接默认是遵循符号链接,就像-L
被指定。
你可以试试看cd -P ..
区别。另一个例子是pwd -L
and 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
返回。