$ cd ~
$ ln -s /real/folder symbolic_link
$ cd symbolic_link
$ cd ..
$ ls -l
symbolic_link -> /real/folder/
$ cd symbolic_link
$ ls -l ..
folder
换句话说,为什么的行为与在符号链接目录中时的行为cd ..
不同?ls ..
答案1
你的 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)
基本上我们使用cd
来改变当前工作目录(我明确使用了默认选项-L
),然后调用ls -l
。&&
运算符表示ls
只有cd
成功时才会执行。括号()
使里面的所有内容在子 shell 中执行。这就是诀窍:cd
命令只会影响这个子 shell,而主 shell 中不会发生任何变化,无需cd
返回。