xterm은 디렉토리를 이동할 때 디렉토리를 전환하지 않습니다.

xterm은 디렉토리를 이동할 때 디렉토리를 전환하지 않습니다.

최근에 나는 xterm이 예상대로 작동하지 않아서 매우 좌절감을 느꼈습니다. 이것이 내가 하는 일이다:

  1. xterm 열기
  2. 다음 명령을 실행하십시오.

    $ mkdir test_01
    $ cd test_01/
    $ echo 'a' > a
    $ cat a
    

    출력은 다음과 같습니다:

    a
    
  3. 다른 xterm을 엽니다(첫 번째 xterm을 닫지 마세요).

  4. 다음 명령을 실행하십시오.

    $ mv test_01/ test_01_old
    $ mkdir test_01
    $ cd test_01
    $ echo 'b' > a
    $ cat a
    

    출력은 다음과 같습니다:

    b
    
  5. 이제 원래 xterm에서 명령을 실행하십시오.

    $ cat a
    

    출력은 다음과 같습니다:

    a
    

왜 이런 일이 발생합니까?이 단계에서 두 xterm 명령은 모두 동일한 디렉토리 pwd(예 /home/user_1/test_01: .

답변1

이것은 xterm과 아무 관련이 없습니다. xterm을 호출하지 않고도 두 셸을 모두 사용하여 동일한 작업을 수행할 수 있습니다. 이 문제에 대해서는 쉘을 사용하여 이를 수행할 수 있습니다(아래 참조).

모든 프로세스에는 현재 작업 디렉터리가 있습니다. 이는 이름으로 추적되지 않고 디렉터리 자체에 대한 (다소) 포인터로 추적됩니다. (내부적으로 어떻게 표현되는지는 잘 모르겠습니다. 아마도 디렉토리의 메이저 및 마이너 번호, inode 번호와 비슷할 것입니다.)

첫 번째 xterm에서 실행 중인 쉘의 현재 디렉토리는 test_01다음과 같습니다. 그런 다음 디렉토리의 이름이 (다른 프로세스에 의해) test_01-- 에서 변경되었지만 test_01_old여전히 동일한 디렉토리이고 쉘 프로세스는 여전히 이 디렉토리를 현재 디렉토리로 사용합니다.

커널은 현재 디렉토리의 이름을 기억하지 못하지만 쉘은 기억합니다. 내장된 명령을 실행할 때 pwd이 정보를 사용합니다 . 첫 번째 xterm 아래의 쉘은 디렉토리 이름이 변경된 것을 인식하지 못하므로 pwd입력할 때 캐시된 경로를 인쇄합니다.

그러나 /bin/pwd이는 외부 명령이므로 셸의 캐시된 정보에 액세스할 수 없습니다. 현재 디렉터리(이름은 즉시 알 수 없음)에서 시작하여 해당 ..항목을 살펴본 다음 루트 디렉터리(즉, 항목이 자신을 가리키는 디렉터리 ..)에 도달할 때까지 디렉터리 계층 구조를 탐색하는 방식으로 작동합니다. 그런 다음 문자로 구분된 경로 요소를 역순으로 인쇄합니다 /.

예를 들어, 방금 내 시스템(Ubuntu 12.04, bash 4.2.24)에서 다음을 수행했습니다.

$ pwd ; /bin/pwd
/home/kst
/home/kst
$ mkdir test_01
$ cd test_01
$ pwd ; /bin/pwd
/home/kst/test_01
/home/kst/test_01
$ mv /home/kst/test_01 /home/kst/test_01_old
$ pwd ; /bin/pwd
/home/kst/test_01
/home/kst/test_01_old
$ cd $(/bin/pwd)
$ pwd ; /bin/pwd
/home/kst/test_01_old
/home/kst/test_01_old
$ 

보시다시피 pwd일관성 /bin/pwd이 있습니다.~까지현재 디렉토리의 이름을 바꾸면 쉘의 내장 기능이 pwd기억하는 현재 디렉토리를 인쇄합니다. 하지만 내가 그렇게 했을 때 cd $(/bin/pwd), 두 사람은 다시 동기화되었습니다.

관련 정보