Por que mover para frente alterna o sistema de arquivos aqui?

3

Se eu navegar para um novo diretório vazio

~$ cd "'mktemp -d'"

e monte um sistema de arquivos lá

/tmp/tmp.4MlNzMERSw$ sudo mount /dev/sda5 .

e, em seguida, tente listar os arquivos lá, não vejo os arquivos neste sistema de arquivos:

/tmp/tmp.4MlNzMERSw$ ll
total 8
drwx------  2 christoph christoph 4096 Jun 18 21:06 ./
drwxrwxrwt 18 root      root      4096 Jun 18 21:09 ../

Minha explicação para isso é que o terminal adquire um descritor de arquivo de /tmp/tmp.4MlNzMERSw quando executo o comando no primeiro bloco de código. Isso é confirmado pelo fato de que posso desmontar o sistema de arquivos executando

/tmp/tmp.4MlNzMERSw$ sudo umount .

nas mesmas janelas de terminal, mas se eu abrir um novo terminal pressionando Ctrl + Shift + N , não consigo. E eu não posso fazê-lo no primeiro terminal até que eu feche o segundo terminal ou navegue nele. É claro que não posso desmontá-lo no segundo terminal, contanto que eu fique em /tmp/tmp.4MlNzMERSw com ele. O ponto é que não importa se eu movo o primeiro terminal para longe de /tmp/tmp.4MlNzMERSw , pois ele parece manter seu antigo descritor de arquivo (de qual /tmp/tmp.4MlNzMERSw costumava ser) e não adquire um novo ( que então manteria o sistema de arquivos ocupado e evitaria a desmontagem não-lenta).

Agora, não esperaria que o autocompletar de nomes de arquivos funcionasse na primeira janela de terminal, mas no segundo. E isso é exatamente o que eu observo. Mas afaik, autocompletar de nomes de arquivos é pré-buscado de qualquer forma, de alguma forma, mesmo que eu não possa encontrar evidências para isso (mas evidência contra isso), no momento.

No entanto, o que não entendo é por que posso fazer alterações de localização relativas para a frente (como cd mnt ) na primeira janela de terminal sem voltar primeiro ( Por exemplo, cd .. e, em seguida, cd tmp.4MlNzMERSw/mnt ou cd tmp.4MlNzMERSw + cd mnt ).

A primeira janela de terminal aparentemente pode usar seu descritor de arquivo existente para listar o conteúdo do diretório como era antes da montagem acontecer. Então, por que ele não usa esse mesmo descritor de arquivo para navegar adiante? * Isso não é possível?

* Se estivesse fazendo isso, a operação obviamente falharia.

Minha configuração

Meu computador roda o Ubuntu 16.04 com o Linux 4.4.0 e as atualizações mais recentes instaladas. Eu uso o emulador de terminal padrão (Terminal GNOME (versão 3.18.3)) com 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
    
por UTF-8 18.06.2017 / 22:09

1 resposta

3

/tmp/tmp.4MlNzMERSw$ sudo mount /dev/sda5 .

Depois de fazer isso, /dev/sda5 é montado em /tmp/tmp.4MlNzMERSw . Mas o diretório atual do shell ainda é o antigo /tmp/tmp.4MlNzMERSw , o que está oculto atrás do ponto de montagem.

it seems to hold on to its old file descriptor (of what /tmp/tmp.4MlNzMERSw used to be) and doesn't acquire a new one

O diretório atual de um processo não é um descritor de arquivo numerado, mas se comporta muito como um descritor de arquivo. O diretório atual é um identificador no diretório, não uma string. O caminho inicialmente usado para alcançar o diretório pode não ser mais válido, mas isso não afeta a validade do descritor de arquivo. Um descritor de arquivo continua referindo-se ao mesmo arquivo até que seja fechado. O diretório atual do processo do shell continua sendo o subdiretório de /tmp até o shell emitir uma chamada de sistema chdir .

Você veria algo semelhante se renomeie o diretório:

$ 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

O diretório atual do shell continua sendo o antigo /tmp/foo , o que contém um arquivo chamado first , até que o comando cd seja chamado.

    
por 19.06.2017 / 00:51