处理“../”时符号链接似乎是矛盾的

处理“../”时符号链接似乎是矛盾的

这里的矛盾在于如何符号链接处理../目录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
  1. _

    [/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

  2. 让我们添加一个符号链接进入目录/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 -Por 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]$ 

相关内容