최근에 나는 xterm이 예상대로 작동하지 않아서 매우 좌절감을 느꼈습니다. 이것이 내가 하는 일이다:
- xterm 열기
다음 명령을 실행하십시오.
$ mkdir test_01 $ cd test_01/ $ echo 'a' > a $ cat a
출력은 다음과 같습니다:
a
다른 xterm을 엽니다(첫 번째 xterm을 닫지 마세요).
다음 명령을 실행하십시오.
$ mv test_01/ test_01_old $ mkdir test_01 $ cd test_01 $ echo 'b' > a $ cat a
출력은 다음과 같습니다:
b
이제 원래 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)
, 두 사람은 다시 동기화되었습니다.