디렉토리를 삭제한 후 비밀번호가 업데이트되지 않는 이유는 무엇입니까?

디렉토리를 삭제한 후 비밀번호가 업데이트되지 않는 이유는 무엇입니까?

나는 작은 실험을 시도하여 Dir1이 Dir2의 상위 폴더가 되도록 데스크톱 디렉터리에 Dir1과 Dir2 폴더 2개를 만들었습니다. /홈/사용자 이름/데스크탑/Dir1/Dir2

그런 다음 cd를 사용하여 비밀번호를 /home/username/Desktop/Dir1/Dir2로 설정했습니다. 다음으로 rm -r /home/username/Desktop/Dir1을 사용하여 Dir1을 삭제했습니다. 이제 pwd를 사용하면 여전히 /home/username/Desktop/Dir1/Dir2로 표시되지만 이제는 존재하지 않습니다. 또한 이 시점에서 ls 또는 cd를 사용하면 "Cannot access /home/username/Desktop/Dir1/Dir2: No such file or Directory"라는 오류가 발생합니다. 이는 확실히 사실이지만 이 문제는 다음과 같은 이유로 발생한다고 생각합니다. 폴더를 삭제한 후에는 비밀번호가 업데이트되지 않습니다.

내가 아는 한, 이 문제에 대한 해결책도 간단합니다. 상위 디렉터리로 이동한 다음 요청한 디렉터리를 삭제할 수 있습니다.

비밀번호가 업데이트되지 않는 특별한 이유가 있는지, 내 솔루션이 올바른지, 그리고/또는 방금 버그를 발견했는지 궁금합니다.

답변1

실제로,Dir2 하다존재하지만이름 Dir2확실히. 혼란스러운? :) 쉘의 현재 디렉토리는 여전히 name 으로 참조되는 디렉토리이므로 Dir2해당 디렉토리는 변경되지 않습니다. 이는 익명 파일과 유사합니다. 일반적으로 파일을 만들 때링크 수0이 되면 파일이 삭제되고 inode가 해제됩니다. 그러나 프로세스에 여전히 파일이 열려 있으면 프로세스가 종료하여 명시적으로 또는 암시적으로 파일을 닫을 때까지 커널은 파일을 삭제하지 않습니다. 이 Dir2경우 쉘이 현재 디렉토리를 변경하지 않는 한 디렉토리는 계속 "열립니다".

무엇Dir1디렉터리의 이름 Desktop과 그 아래의 전체 이름 계층 구조( ...항목 포함)가 사라집니다. 호출되었던 디렉토리 Dir1도 사라졌습니다(다른 프로세스가 현재 디렉토리로 가지고 있지 않다고 가정). i-노드 레벨의 파일 및 디렉토리는 계층 구조를 형성하지 않습니다. 즉, i-노드에서 상위, 하위 또는 형제 항목으로의 링크가 없습니다. 계층 구조는 기본적으로 파일 및 기타 디렉터리를 가리키는 (이름, inode) 쌍인 디렉터리 항목에서 개별적으로 구축됩니다.

이 긴 소개 후에 원래 질문을 다음과 같이 바꿀 수 있습니다. " Dir2디렉토리 항목이 삭제될 때 쉘이 현재 디렉토리를 다른 디렉토리로 변경하지 않는 이유는 무엇입니까 Dir1?" 한 가지 이유는 쉘이 이를 인식하지 못하기 때문입니다. 이 지점에서. 다른 프로세스에서 rm프로그램을 실행하고 디렉터리를 삭제했지만 이에 대해 쉘에 알리는 메커니즘이 없습니다. 둘째, 쉘은 어떤 디렉토리를 새로운 현재 디렉토리로 선택합니까? chdir새 디렉터리가 포함된 문자열을 인수로 사용하는 시스템 호출을 사용하여 디렉터리를 변경합니다 . 쉘은 을 시도할 수 있지만 chdir("..")위에서 본 것처럼 항목을 이미 파괴했습니다 ..! 3. 쉘이 현재 디렉토리를 변경하는 이유는 무엇입니까? 이렇게 할 이유가 없고, 있는 곳이 편안하며, 명시적으로 지시하지 않고 마법처럼 디렉터리를 변경하는 데 익숙하지 않습니다.

물론 이 상황은 다소 병적이지만 사용자가 피해야 할 상황입니다.

관련 정보