这里的矛盾在于如何符号链接处理../
目录2方法:
- 将当前路径视为结果打印者
pwd
- 将当前路径视为绝对路径
我将通过一个例子来讨论它们(很容易理解)。
考虑以下目录层次结构:
/tmp/
|__a/
| |__b/
|
|__sb=./a/b/ -> /tmp/a/b/ # the name `sb' means symbol b;
# `sb' is generated by:
# [/tmp/]$ ln -s ./a/b/ sb
_
[/tmp/]$ cd sb # `pwd' says we are now in /tmp/ # let's change to /tmp/a/b/ [/tmp/sb/]$ cd ../ # Now we are in /tmp/a/b/ # But what is /tmp/a/b/'s parent dir? [/tmp/]$ # See? We didn't come back to /tmp/a/ BUT /tmp/
这意味着当前父目录是右边第二个印刷者
pwd
。让我们添加一个符号链接进入目录
/tmp/a/b/
:/tmp/ |__a/ | |__b/ | |__sa=../ -> /tmp/a/ # [/tmp/a/b/]$ ln -s ../ sa | |__sb=./a/b/ -> /tmp/a/b/
这一次,我们将回到现实父目录的
/tmp/a/b/
:[/tmp/]$ cd sb # change to /tmp/a/b/ [/tmp/sb/]$ cd sa # sa=../ # /tmp/sb/=/tmp/a/b/ # ^ or ^ [/tmp/sb/sa/]$ ls --classify b/ # ??? # We are now in /tmp/a/ because there is a b/ here!
那么为什么这次它选择参考绝对路径以确定父目录?
当涉及 时,就会出现矛盾../
,但我怀疑当涉及相对路径时也会发生同样的事情。
以上所有操作均在CentOS 7.9上测试
答案1
[/tmp/sb/]$ cd ../ # Now we are in /tmp/a/b/ # But what is /tmp/a/b/'s parent dir? [/tmp/]$ # See? We didn't come back to /tmp/a/ BUT /tmp/ ```
这是因为 shell 会记住您用来到达那里的路径,以方便起见。
它很有帮助,因为您可以将一些长路径链接到主目录中的短符号链接,然后直接走cd thelink
,而cd ..
无需再次考虑长路径。或者在多用户系统中,系统管理员可以为您做这件事,您甚至不需要知道正确的道路。
但如果你使用pwd -P
or cd -P
,shell 会忽略它:
[/tmp]$ mkdir -p a/b; ln -s ./a/b sb
/tmp$ cd sb
[/tmp/sb]$ pwd -P
/tmp/a/b
[/tmp/sb]$ cd -P ..
/tmp/a$
[/tmp/sb/]$ cd sa # sa=../ # /tmp/sb/=/tmp/a/b/ # ^ or ^ [/tmp/sb/sa/]$ ls --classify b/ # ??? # We are now in /tmp/a/ because there is a b/ here!
这里,...
符号链接中的 是由内核解析的,它不知道 shell 的想法。 shell 仍然会显示您所走的路径(sb
,然后sa
),并cd ..
让您返回到/tmp/sb
。除非你使用-P
.
同样,如果您运行外部pwd
实用程序,它会向您显示“物理”路径,因为它也不知道您选择的路径。
[/tmp/sb/sa]$ pwd
/tmp/sb/sa
[/tmp/sb/sa]$ pwd -P
/tmp/a
[/tmp/sb/sa]$ /bin/pwd
/tmp/a
顺便说一句,如果您使用cd -P
更改目录,它会解析pwd
提示中显示的路径的符号链接:
[/tmp]$ cd -P sb/sa
[/tmp/a]$