누군가가 말하면 그러한 수차가 생길 수 있다고 생각할 수 있습니다.
mkdir /tmp/strange_dir
파일 시스템이 가득 찼을 때 (즉, 사용 가능한 블록이 없음). 에 이미 strange_dir
디렉토리 항목 을 생성하는 것이 가능했을 것 입니다 /tmp
. 왜냐하면 이미 할당 된 블록 중 하나에 사용되지 않는 공간이 몇 바이트에 불과하기 때문입니다 /tmp
. 그러나 블록 strange_dir
자체 를 할당하는 것은 불가능 했기 때문에 .
및 ..
항목 을 작성하는 것은 불가능했을 것 입니다. 이 경우 mkdir
프로그램이에서 strange_dir
디렉토리 항목 을 제거 (링크 해제) 할 것으로 예상 /tmp
하지만 소프트웨어가 항상 내가 원하는 것을 수행하지는 않습니다.
다른 가능성 :
mkdir
에 strange_dir
디렉토리 항목 /tmp
작성과에 .
및 ..
항목 작성 사이에 중단 (종료) 되었습니다 strange_dir
. 나는 기대 mkdir
인터럽트 신호 (즉, 잡으려고 Ctrl+를 C) 자체 뒤처리하지만, 소프트웨어 및 그것의 나의 기대에 대한 위의 내용 참조. 물론 킬 신호 나 시스템 충돌을 포착 할 수 없습니다.
rmdir
의 .
및 ..
항목을 strange_dir
연결 해제하고의 strange_dir
디렉토리 항목을 연결 해제하는 중에 중단 (종료) 되었습니다 /tmp
.
fsck
충돌 후 실행되는 것이를 감지하고 strange_dir
그것에 대해 무언가를 할 것으로 기대할 수 있지만 ....
예, 디렉토리가 공의 크기가있는 경우 물론, 그게에 할당에는 블록이 없다는 것을 의미하며, 따라서 어떤 내용 (같은 심지어 어린 아이들을 가질 수 없습니다 .
와 ..
).
없는 cd ..
경우 왜 작동 하는지 이해 하지 ..
못하지만 명령 행 인터페이스를 사용하여 내부에서 디렉토리 제거에 대한 토론을 참조하십시오 . 그것은 밝혀졌다
mkdir / tmp / strange_dir
cd / tmp / strange_dir
ls -lai ← 정상으로 표시 됩니다. 및 .. inode 번호가 있습니다.
rmdir / tmp / strange_dir
pwd ← 여전히 / tmp / strange_dir을 보고합니다.
ls -lai ← 빈 디렉토리를 보여줍니다 : 총 0
ls -ldi ← Shows . 이전과 같은 inode 번호로
그러나 크기는 0이고 링크 수는 0입니다.
cd .. ← / tmp에 다시 넣습니다.
이 상황은이 질문의 상황과 완전히 유사하지는 않습니다. 왜냐하면이 경우에는에서 strange_dir
제거 되기 때문 입니다 /tmp
. 그러나 그것은 cd ..
특별 하다는 것을 암시 하며 때로는 할 수있는 명확한 메커니즘이 없을 때 작동합니다.
pwd와 / bin / pwd의 이상한 차이는 이것이 어떻게 작동하는지에 대한 가능성을 시사합니다. 쉘은 현재 디렉토리를 추적합니다. 즉, 현재 디렉토리가 무엇인지에 대한 최상의 추측을 추적합니다. 그것은 상징적 인 링크와 같은 속임수에 속아서
mkdir /tmp/foo
cd /tmp/foo
mv /tmp/foo /tmp/foobar
즉, 그것은 여전히 현재 디렉토리이라고 생각합니다 /tmp/foo
, 그래서 그 무엇을 pwd
보고 있지만 pwd -P
및 /bin/pwd
보고합니다 /tmp/foobar
. 따라서 chdir("..")
실패 할 경우 쉘은 다음 레벨 업 디렉토리가 무엇이라고 생각하는지 계산하고 절대적으로 거기에갑니다. (그러나 나는 그것보다 더 많은 것이 있다고 생각합니다.)
stat
디렉토리에 있습니다. 않습니다cd strange_dir; stat -l .
아무것도주지?