추가 읽기

추가 읽기

첫 번째 터미널 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().작업 디렉터리에 이름이 없습니다.더 이상 연락하지 마세요.

추가 읽기

답변2

현재 디렉토리가 삭제되었는지 확인하고 싶다면 inode를 확인해 보세요.

먼저 현재 디렉터리의 inode 번호(예: 117002)를 가져옵니다.

ls -ial | grep '\s\.$' | awk '{print $1}'

그런 다음 상위 디렉토리에서 inode 경로를 찾으십시오. 그렇지 않은 경우 원래 디렉터리가 삭제됩니다.

find .. -inum 117002

관련 정보