첫 번째 터미널 A에서 디렉터리를 만들고 해당 디렉터리로 이동하여 파일을 만듭니다.
$ mkdir test
$ cd test
$ touch file1.txt
$ ls
file1.txt
그런 다음 다른 터미널 B에서 디렉토리를 삭제합니다.
$ rm -r test
$ mkdir test
$ cd test
$ touch file2.txt
그런 다음 다시 터미널 A로 돌아가서(아무 작업도 하지 않음 cd
) 파일 목록을 나열해 봅니다.
$ ls
ls
아무것도 보지 못했고 불만도 없었습니다.
뒤에서 무슨 일이 일어나고 있나요? 왜 ls
문제를 볼 수 없습니까? 터미널 A의 일부 문제를 파악하기 위한 표준, 이식 가능 및/또는 권장 방법이 있습니까?
pwd
올바른 것으로 보이는 디렉토리 이름만 인쇄합니다. touch file3.txt
해당 파일이나 디렉토리가 없다고 하는데 도움이 되지 않습니다. 두 개의 매우 긴 오류 줄만 bash -c "pwd"
제공하는데, 이는 문제에 대한 내용을 어느 정도 드러내지만 실제로는 설명적이지 않으며 다른 시스템 간에 얼마나 이식성이 있는지 잘 모르겠습니다(저는 Ubuntu 16.04를 사용합니다). cd .. && cd test
문제를 해결했지만 실제로 무슨 일이 일어나고 있는지 설명하지 않았습니다.
답변1
왜
ls
문제를 볼 수 없습니까?
애초에 "문제"가 없습니다.
터미널 A에 문제가 발생했습니다.
아무 문제가 없습니다. 링크되지 않은 파일을 여는 프로세스에 대해 정의된 의미가 있는 것처럼 링크되지 않은 디렉터리를 여는 프로세스에 대해 정의된 의미가 있습니다. 둘 다 정상적인 일입니다.
무언가를 참조하는 디렉터리 항목의 링크를 해제하고(해당 콘텐츠를 어딘가에서 여는 동안) 다음 링크된 원래 이름으로 디렉터리 항목을 생성하는 의미론이 정의되어 있습니다.다른 것: 너지금은 2개가 있어요첫 번째 항목을 참조하는 공개 설명은 두 번째 항목에 액세스할 수 없으며 그 반대의 경우도 마찬가지입니다. 이는 디렉터리와 파일 모두에 해당됩니다.
프로세스는 다음과 같은 방법으로 디렉터리에 대한 열린 파일 설명을 가질 수 있습니다.
- 프로세스의 작업 디렉터리입니다.
- 프로세스의 루트 디렉터리입니다.
- 라이브러리 함수를 호출하는 프로세스에 의해 열립니다
opendir()
. - 이는 라이브러리 함수를 호출하는 프로세스에 의해 열립니다
open()
.
rmdir()
아직 열려 있는 디렉토리에 대한 링크를 삭제할 수 없도록 허용합니다(이것은 일부 이전 Unices의 동작이며 또한 일부 Unix-non-Linux POSIX 호환 시스템의 동작임).필수의아직 열려 있는 디렉터리가 경로 이름 구성 요소로 끝나는 이름으로 연결이 해제되면 실패합니다 .
. 그러나 성공하고 디렉터리에 대한 최종 링크가 제거되면 정의된 의미는 아직 열려 있지만 연결되지 않은 디렉터리에 대한 것입니다.
- 디렉토리 항목 없음별말씀을요;
- 시도하는 프로세스에 쓰기 액세스 또는 권한 있는 액세스가 있더라도 이후에는 디렉터리 항목을 만들 수 없습니다.
EBUSY
귀하의 운영 체제는 이러한 경우에 반환되지 않는 운영 체제 중 하나이며 rmdir()
, 첫 번째 터미널 세션의 셸에는 연결되지 않았지만 여전히 열려 있는 디렉터리가 현재 디렉터리로 있습니다. 당신이 보는 모든 것은 그 맥락에서 정의된 행동입니다. ls
예를 들어 비어 있음이 아직 열려 있음을 나타냅니다.첫 번째디렉토리둘당시 가지고 있는 디렉토리.
심지어 출력은 pwd
. 셸에서 내장 명령으로 실행하면 셸은 내부적으로 셸/환경 변수에서 현재 디렉터리의 이름을 추적합니다. 다른 쉘에서 내장 명령으로 실행하면 다른 쉘은 작업 디렉토리의 장치 및 inode 번호를 비교할 수 없습니다.두 번째 디렉토리이제 상속받은 환경 변수의 내용에 따라 이름이 지정 PWD
되므로 무엇을 신뢰할 수 없는지 결정됩니다 PWD
.그 다음에라이브러리 기능이 실패했습니다 getcwd()
.작업 디렉터리에 이름이 없습니다.더 이상 연락하지 마세요.
추가 읽기
rmdir()
. "시스템 인터페이스". 오픈 그룹 기본 사양. IEEE 1003.1:2017.- https://unix.stackexchange.com/a/413225/5132
- "." 디렉터리를 삭제할 수 없는 이유는 무엇입니까?
- 'rm .*' 상위 디렉토리를 삭제하셨나요?
답변2
현재 디렉토리가 삭제되었는지 확인하고 싶다면 inode를 확인해 보세요.
먼저 현재 디렉터리의 inode 번호(예: 117002)를 가져옵니다.
ls -ial | grep '\s\.$' | awk '{print $1}'
그런 다음 상위 디렉토리에서 inode 경로를 찾으십시오. 그렇지 않은 경우 원래 디렉터리가 삭제됩니다.
find .. -inum 117002