Linux에서는 한 디렉터리를 다른 디렉터리로 이동 mv
하고 다른 셸에서는 작업 디렉터리가 이동된 디렉터리가 됩니다.
해당 셸에서 실행했는데 hg pull
놀랍게도 새 작업 디렉터리에서 를 입력하지 않고도 올바르게 실행되었습니다 cd
.
어떻게 작동하나요?
답변1
파일이나 디렉터리를 이동하면 파일 트리에서 해당 상위 항목을 식별하는 메타데이터 특성이 변경되지만 실제 노드 ID는 변경되지 않습니다. 실제 디스크에서는 여전히 동일한 위치에 있으며 파일 시스템에서는 이를 여전히 동일한 개체로 간주합니다. 파일이나 디렉터리 포인터가 열리는 곳이면 어디든 이미 개체에 연결되어 있으며 개체의 메타데이터에 대한 변경 사항은 열기 프로세스에 영향을 주지 않습니다. 파일 시스템 경로를 기반으로 새 포인터를 열려고 할 때만 문제가 발생합니다.
같은 이유로, 쓰고 있는 파일을 이동할 수 있으며 쓰기는 새 위치로 계속됩니다. 왜냐하면 실제로는 동일한 파일 노드이고 파일 구조의 다른 위치에 다시 연결되기 때문입니다. 디스크의 물리적 위치나 노드 ID가 변경되지 않고, 파일 시스템은 단순히 디스크에 있는 노드의 내부 매핑을 파일 시스템의 경로로 업데이트합니다.
또한 이 동작은 이동된 개체가 동일한 파일 시스템에 있는 경우에만 적용됩니다. 한 설치에서 다른 설치로 이동하는 경우 노드의 물리적 위치가 변경되어야 하며 개체는 원래 파일 시스템에서 삭제되어 데드 포인터가 남습니다!
답변2
Unix 커널은 각 프로세스의 작업 디렉터리를 추적합니다. 마운트된 볼륨에 CD를 넣은 다음 마운트 지점에서 root로 명령을 실행하여 umount
이를 증명할 수 있습니다. 장치 사용량에 대한 몇 가지 메시지를 받게 됩니다.
분명히 최신 쉘에는 작업 디렉토리라고 불리는 것이 있습니다. 그렇지 않으면 쉘의 서브루틴(C, Python 등)이 명령줄에 상대 경로가 제공될 때 올바른 파일을 열 수 없습니다.
그러나 최신 쉘(ksh, bash, zsh 등)은 작업 디렉토리에서 게임을 합니다. 중간 계층 어딘가에 심볼릭 링크가 있는 디렉토리 트리를 생성하여 이를 입증할 수 있습니다.
% mkdir a
% cd a
% mkdir b.orig
% ln -s b.orig b
% mkdir b.orig/c
% cd ..
% cd a/b/c
% pwd
/home/bediger/a/b/c
이것이 바로 zsh의 전부입니다. 심볼릭 링크를 따라 트리를 백업하고 ".." 디렉토리를 사용하여 작동했다면 찾을 것입니다.a/b.orig/c