다음 폴더 구조를 고려하세요.
.
├── test1
│ ├── nested1
│ ├── testfile11
│ └── testfile12
└── test2
├── nested1 -> /path/to/dir/test1/nested1
└── testfile21
test2/nested1
디렉토리에 대한 심볼릭 링크입니다 test1/nested1
. cwd라면 ..
이렇게 하겠다고 결심할 것이라 예상합니다 test2
. 그러나 나는 다음과 같은 불일치를 발견했습니다.
$ cd test2/nested1/
$ ls ..
nested1 testfile11 testfile12
$ cd ..
$ ls
nested1 testfile21
touch
또한 ls
에서 파일을 생성하는 것처럼 동작합니다 test1
.
..
인수로 cd
심볼릭 링크의 상위 항목을 참조하는 반면 (모두?) 다른 인수는 링크된 디렉토리의 상위 항목을 참조하는 이유는 무엇입니까 ? 심볼릭 링크와 관련된 경로를 참조하도록 강제하는 쉬운 방법이 있습니까? 그게 "반대"인가요 readlink
?
# fictional command
ls $(linkpath ..)
편집 : bash 사용
답변1
명령을 내리고 cd
두 pwd
가지 작동 모드가 있습니다.
-L 논리 모드: 심볼릭 링크가 해결되지 않음
-P 물리적 모드: 작업을 수행하기 전에 기호 링크를 확인합니다.
여기서 알아야 할 중요한 점은 cd ..
시스템 호출을 호출하지 않고 쉘의 변수를 chdir("..")
단축한 다음 chdir을 해당 절대 경로로 단축한다는 것입니다.$PWD
이는 물리적 모드에서 호출하는 것과 동일 chdir("..")
하지만 논리 모드에서는 다릅니다.
여기서 가장 큰 문제는 POSIX가 덜 안전한 논리 모드를 기본값으로 사용하기로 결정했다는 것입니다.
cd -P
을 호출하는 대신 호출하면 cd
작업 후 chdir()
반환 값이 getcwd()
셸 변수에 저장되고 $PWD
다음을 수행 cd ..
하면 물리적으로 현재 디렉터리로 이동됩니다.
그렇다면 POSIX가 기본적으로 덜 안전한 이유는 무엇입니까?
POSIX 기본 모드에서 심볼릭 링크를 확장하고 다음을 수행하는 경우:
ls ../*.c
cd ..
rm *.c
이전 명령으로 나열된 파일과 다른 파일을 삭제할 수 있습니다 ls
.
보다 안전한 물리적 모드를 선호하는 경우 다음 별칭을 설정하세요.
alias cd='cd -P'
alias pwd='pwd -P'
여러 옵션을 사용 -L
하고 -P
마지막 옵션이 승리하는 경우에도 여전히 다른 동작을 얻을 수 있습니다.
역사 배경:
Bourne Shell과 ksh88은 동시에 디렉토리 추적 코드를 얻었습니다.
Bourne Shell은 더 안전한 물리적 동작을 얻은 반면 ksh88은 기본값과 -L
옵션 으로 덜 안전한 논리 모드를 얻었습니다 -P
. ksh88은 csh 동작을 참조할 수 있습니다.
POSIX는 ksh88 동작을 채택했지만 이것이 좋은 결정인지에 대해서는 논의가 없었습니다.
$PWD
참고: 일부 쉘은 보다 긴 값을 추적할 수 없습니다 . PATH_MAX
이로 인해 절대 경로가 보다 긴 디렉토리에 chdir을 입력하면 미치게 될 수 있습니다 PATH_MAX
. dash
정말 결함이 있는 껍질이에요.
답변2
읽어야 할 중요한 논문은 다음과 같습니다.http://doc.cat-v.org/plan_9/4th_edition/papers/lexnamesRob Pike가 이 문제에 대해 이야기합니다.
또한 쉘(예: bash)이 실제로 시스템 호출을 cd ..
실행하는 대신 마지막 구성 요소를 잘라내고 거기에서 변경한다고 말하면 현재 디렉토리에 대해 어떻게 생각하는지 추적하도록 지정해야 합니다 .chdir("..")
지금은 휴대폰으로 죄송합니다. 나중에 수정하겠습니다.
답변3
심볼릭 링크를 따르는 대신 물리적 디렉토리 구조를 따르는 -pa를 시도해 볼 수도 있습니다.