경로 확인은 pwd(기호 링크 디렉터리)에 따라 다릅니다.

경로 확인은 pwd(기호 링크 디렉터리)에 따라 다릅니다.

이는 /sys/bus나무 아래에서 자주 발생합니다(bash-5.1).

다음과 같이 foo다른 디렉토리에 대한 여러 심볼릭 링크를 나열하는 디렉토리가 있다고 가정해 보겠습니다 .ls -ails pathto_foo

lrwxrwxrwx 1 root root    0 21 foo1 -> whatever relative path to symlinked foo1
lrwxrwxrwx 1 root root    0 21 foo2 -> whatever relative path to symlinked foo2

이러한 각 심볼릭 링크 디렉터리에는 다음과 같은 일반 파일이 포함되어 있습니다 bar.
현재 작업 디렉터리를 pathto_foo/foo1또는 으로 변경하면 문제 없이 , , ...을 수행 pathto_foo/foo2할 수 있습니다 .filestatcatbar

그러나 내 비밀번호는 pathto-foo/foo1(또는 pathto_foo/foo2)로 설정되어 있으며 sat-ing/c-ating/file-ing ../foo2/bar( ../foo1/bar각각)은 체계적으로 다음을 반환합니다.

../foox/bar : No such file or directory

좋아요! 나는 이 극도로 바람직하지 않은 행동을 어느 정도 이해하고 받아들일 수 있지만, 다음과 같은 불일치는 이해하지도 받아들이지도 않습니다.

이 두 디렉토리 중 하나에 있는 경우 pathto_foo/foo1stat/cat/file ../foo1/bar(예! pwd의 상대 경로를 의미합니다.) 나는 성공할 것이다.

그렇다면 경로 확인이 pwd에 의존하는 이유는 무엇입니까? (비밀번호에 대한 상대 경로가 유사하게 작성된 다른 상대 경로와 다르게 확인되는 이유는 무엇입니까?)
이를 방지하고 비밀번호에 관계없이 동일한 답변(성공 또는 실패)을 얻을 수 있는 방법은 무엇입니까?

답변1

디렉토리에는 자신을 가리키는 여러 개의 기호 링크가 있을 수 있지만 기호 링크에 관계없이 실제 상위 디렉토리는 하나만 있습니다.

따라서 /sys/bus/pathto_foo두 개의 심볼릭 링크를 포함합니다.

lrwxrwxrwx 1 root root    0 21 foo1 -> /sys/some/where/foo1
lrwxrwxrwx 1 root root    0 21 foo2 -> /sys/else/where/foo2

cd당신이 있을 때 pathto_foo:

  • 당신의 cat foo1/bar지도cat /sys/some/where/foo1/bar
  • 당신의 cat foo2/bar지도cat /sys/else/where/foo2/bar

a를 실행할 때 실제 작업 디렉토리는 cd foo1실제로는 아니지만 쉘(/sys/bus/pathto_foo/foo1/sys/some/where/foo1그리고 껍질만) 당신이 무엇이라고 불렀는지 기억할 것입니다 /sys/bus/pathto_foo/foo1.

이제 그렇게 하면 cat ../foo1/bar심볼릭 ..링크 /sys/some/where/와 그것이 가리키는 실제 디렉토리 모두 편리한 이름이 지정되므로 foo1전체 경로는 /sys/some/where/foo1/bar예상한 대로가 됩니다 .

을 시도하면 cat ../foo2/bar이제 에 매핑되지만 에는 하위 디렉터리 /sys/some/where/foo2/bar가 없습니다 .foo2/sys/some/where

실제로 일어나는 일은 디렉토리 트리의 완전히 다른 분기에 있다는 것입니다 foo2./sys/else/where/foo2

여기에 오는 데 사용한 심볼릭 링크는 /sys/bus/pathto_foo다음 위치에 있습니다.실제가 아닌 ../sys/some/where/foo1.

a를 실행할 때 cd ..최신 POSIX 호환 쉘의 기본값은bash논리적상위 디렉토리로 이동합니다.사용자가 현재 디렉터리에 도달하기 위해 사용하는 경로의 가장 오른쪽 요소를 자르고 해당 경로로 변경합니다..

대부분의 다른 프로그램은 "상위 디렉터리"의 개념을 단순히 " ..파일 시스템에서 제공하는 디렉터리 항목"으로 이해합니다.물리적부모.

이 명령에는 cd실제로 전환할 경로에 대한 논리적 또는 물리적 해석을 명시적으로 요청하는 두 가지 옵션 및 가 bash있습니다 . 두 옵션 중 하나를 지정하지 않으면 내장된 기본값이 마치 실제처럼 작동하므로 위의 지침을 따르십시오. 이 옵션을 사용 하면 명령은 다른 모든 프로그램처럼 작동하며 사용될 때마다 실제 상위 디렉터리로 변경됩니다.-L-P-L-Pcd..

셸의 이(버그가 있는) 기능이 마음에 들지 않으면 이를 비활성화하는 셸별 방법이 있을 수 있습니다. bash쉘 의 경우 또는 유사한 쉘 시작 스크립트 에 set -P또는 를 추가하면 bash는 명시적으로 사용 되지 않는 한 모든 cd 명령에 해당 옵션이 있는 것처럼 작동합니다 .set -o physical~/.bashrc-P-L

관련 정보