"../"를 처리할 때 심볼릭 링크가 모순되는 것 같습니다.

"../"를 처리할 때 심볼릭 링크가 모순되는 것 같습니다.

여기서 모순은 다음과 같습니다.심볼릭 링크프로세스 ../디렉토리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/ ```

이는 편의를 위해 쉘이 해당 위치에 도달하는 데 사용한 경로를 기억하기 때문입니다.

긴 경로를 홈 디렉토리의 짧은 심볼릭 링크에 연결하고 긴 경로에 대해 다시 생각할 필요 cd thelink없이 바로 이동할 수 있기 때문에 도움이 됩니다. cd ..또는 다중 사용자 시스템에서는 시스템 관리자가 대신 이를 수행할 수 있으며 사용자는 필요하지도 않습니다.알다올바른 길.

pwd -P그러나 or 를 사용하면 cd -P쉘은 이를 무시합니다.

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

여기서 ...심볼릭 링크는 쉘이 무엇을 생각하는지 전혀 모르는 커널에 의해 해결됩니다. 쉘은 여전히 ​​사용자가 선택한 경로를 표시하고( 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]$ 

관련 정보