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

为什么当我在符号链接目录中时“ls ..”会显示真实的父内容?
$ 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 -Land pwd -P(whilepwd也是 shell 的内置命令)。

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

另一方面,ls这是一个单独的可执行文件,它无法从 shell 的跟踪功能中获益。但是,您可以使用以下技巧让它跟踪符号链接:

(cd -L .. && ls -l)

基本上我们使用cd来改变当前工作目录(我明确使用了默认选项-L),然后调用ls -l&&运算符表示ls只有cd成功时才会执行。括号()使里面的所有内容在子 shell 中执行。这就是诀窍:cd命令只会影响这个子 shell,而主 shell 中不会发生任何变化,无需cd返回。

相关内容