새로운 빈 디렉토리로 이동하면
~$ cd "`mktemp -d`"
거기에 파일 시스템을 마운트합니다.
/tmp/tmp.4MlNzMERSw$ sudo mount /dev/sda5 .
그런 다음 거기에 있는 파일을 나열하려고 하면 해당 파일 시스템에 파일이 표시되지 않습니다.
/tmp/tmp.4MlNzMERSw$ ll
total 8
drwx------ 2 christoph christoph 4096 Jun 18 21:06 ./
drwxrwxrwt 18 root root 4096 Jun 18 21:09 ../
/tmp/tmp.4MlNzMERSw
이에 대한 설명은 첫 번째 코드 블록에서 명령을 실행하면 터미널이 파일 설명자를 얻는다는 것입니다. 이는 다음을 실행하여 파일 시스템을 마운트 해제할 수 있다는 사실로 확인되었습니다.
/tmp/tmp.4MlNzMERSw$ sudo umount .
동일한 터미널 창에서 을 눌러 새 터미널을 열면 Ctrl + Shift + N. 두 번째 터미널을 닫거나 그 안에서 탐색할 때까지는 첫 번째 터미널에서 이 작업을 수행할 수 없습니다. 물론 제2터미널에 머무르는 동안에는 제거할 수 없습니다 /tmp/tmp.4MlNzMERSw
. 요점은 이전 파일 설명자(이전 파일 설명자 )를 유지하고 새 터미널(파일을 유지하게 될)을 얻지 못하는 /tmp/tmp.4MlNzMERSw
것처럼 첫 번째 터미널을 방해가 되지 않는 곳으로 옮겨도 상관이 없다는 것입니다. /tmp/tmp.4MlNzMERSw
시스템이 사용 중이므로 지연되지 않은 제거가 방지됩니다).
이제 파일 이름 자동 완성이 첫 번째 터미널 창에서 작동하는 것이 아니라 두 번째 터미널 창에서 작동하기를 원합니다. 이것이 바로 제가 관찰한 것입니다. 그러나 내가 아는 한, 파일 이름의 자동 완성은 어떻게든 프리패칭되어 있습니다. 비록 현재로서는 이에 대한 증거를 찾을 수 없지만(반대하는 증거는 있습니다).
그러나 내가 이해하지 못하는 것은 내가 왜할수있다cd mnt
첫 번째 터미널 창에서 상대 위치가 앞으로 변경됩니다(like).아니요먼저 반환합니다(예: cd ..
then cd tmp.4MlNzMERSw/mnt
또는 cd tmp.4MlNzMERSw
+ cd mnt
).
첫 번째 터미널 창은 설치 전과 마찬가지로 기존 파일 설명자를 사용하여 디렉터리 내용을 나열할 수 있습니다. 그렇다면 앞으로 탐색하기 위해 동일한 파일 설명자를 사용하지 않는 이유는 무엇입니까? * 불가능한 일인가요?
* 이렇게 하면 작업이 당연히 실패하게 됩니다.
내 설정
내 컴퓨터는 Linux 4.4.0 및 최신 업데이트가 설치된 Ubuntu 16.04를 실행하고 있습니다. 저는 기본 터미널 에뮬레이터(GNOME 터미널(버전 3.18.3))와 bash 4.3.48을 사용하고 있습니다.
$ /proc/self/exe --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ gnome-terminal --version
GNOME Terminal 3.18.3
$ uname -r
4.4.0-79-generic
답변1
/tmp/tmp.4MlNzMERSw$ sudo mount /dev/sda5 .
이 작업이 완료되면 /dev/sda5
쉘은 에 설치되지만 /tmp/tmp.4MlNzMERSw
쉘의 현재 디렉토리는 여전히 이전 디렉토리 /tmp/tmp.4MlNzMERSw
, 즉 마운트 지점 뒤에 숨겨진 디렉토리입니다.
이전 파일 설명자(예전의 /tmp/tmp.4MlNzMERSw)를 유지하고 새 파일 설명자를 얻지 못하는 것 같습니다.
프로세스의 현재 디렉터리는 번호가 매겨진 파일 설명자가 아니지만 파일 설명자와 매우 유사하게 동작합니다. 현재 디렉터리는 문자열이 아닌 디렉터리에 대한 핸들입니다. 원래 디렉터리에 도달하는 데 사용된 경로는 더 이상 유효하지 않을 수 있지만 이는 파일 설명자의 유효성에 영향을 미치지 않습니다. 파일 설명자는 해당 파일이 닫힐 때까지 동일한 파일을 계속 참조합니다. 쉘 프로세스의 현재 디렉토리는 /tmp
쉘이 chdir
시스템 호출을 발행할 때까지의 하위 디렉토리입니다.
디렉터리 이름을 바꾸면 다음과 같은 내용이 표시됩니다.
$ mkdir /tmp/foo
$ cd /tmp/foo
$ pwd
/tmp/foo
$ touch first
$ ls
first
$ mv /tmp/foo /tmp/bar
$ pwd
/tmp/foo
$ pwd -P
/tmp/bar
$ mkdir /tmp/foo
$ echo $PWD
/tmp/foo
$ ls
first
$ ls $PWD
$ cd $PWD
$ ls
쉘의 현재 디렉토리는 이전 디렉토리 /tmp/foo
, 즉 명령이 호출될 first
때까지 이름이 지정된 파일이 포함된 디렉토리로 유지됩니다.cd