cwd가 디렉토리에 대한 심볼릭 링크인 경우 ..(점) bash에서 구문 분석하는 방법

cwd가 디렉토리에 대한 심볼릭 링크인 경우 ..(점) bash에서 구문 분석하는 방법

다음 폴더 구조를 고려하세요.

.
├── 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

명령을 내리고 cdpwd가지 작동 모드가 있습니다.

  • -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를 시도해 볼 수도 있습니다.

http://linuxcommand.org/lc3_man_pages/cdh.html

관련 정보