Como o bash continua funcionando corretamente quando você move seu diretório de trabalho?

5

No Linux, movi um diretório para outro diretório usando mv e, em outro shell, meu diretório de trabalho era o diretório que foi movido.

Corri hg pull nesse shell e, para minha surpresa, ele foi executado corretamente no novo diretório de trabalho - sem precisar digitar cd .

Como isso funcionou?

    
por Robin Green 04.07.2011 / 18:25

2 respostas

11

Mover um arquivo ou diretório altera a propriedade de metadados que identifica seu pai na árvore de arquivos, mas não altera seu id de nó real. No disco físico, ele ainda está no mesmo lugar, e o sistema de arquivos ainda o conhece como o mesmo objeto. Em qualquer lugar em que o ponteiro de arquivo ou diretório esteja aberto, ele já estará conectado a esse objeto, e uma alteração nos metadados de objetos não afetará os processos abertos. As coisas só irão quebrar quando você tentar abrir um novo ponteiro baseado no caminho do sistema de arquivos.

Da mesma forma, você pode mover um arquivo que está sendo gravado e as gravações continuarão indo para o novo local; porque é na verdade o mesmo nó de arquivo, apenas reconectado a um lugar diferente na estrutura de arquivos. Nem a localização física no disco nem o id do nó mudam, o sistema de arquivos apenas atualiza seu mapa interno de nós no disco para os caminhos no sistema de arquivos.

Além disso, esse comportamento se aplica apenas quando o objeto movido permanece no mesmo sistema de arquivos. Se você movê-lo de uma montagem para outra, a localização física do nó deve ser alterada e o objeto será excluído do sistema de arquivos original, deixando os ponteiros mortos!

    
por 04.07.2011 / 18:32
2

Os kernels Unix controlam o diretório que cada processo possui para um diretório de trabalho. Você pode provar isso digitando cd em um volume montado e, em seguida, como root, fazendo um umount no ponto de montagem. Você receberá algumas mensagens sobre como o dispositivo está ocupado.

E claramente, os shells modernos têm o diretório de trabalho que eles dizem ter, caso contrário os programas que são filhos do shell (C, Python ou outros) não abrem o arquivo correto quando recebem um caminho relativo na linha de comando. / p>

Mas os shells modernos (ksh, bash, zsh, talvez outros) jogam com o diretório de trabalho. Você pode provar isso criando uma árvore de diretórios que tenha um link simbólico em algum lugar nos níveis intermediários:

% mkdir a
% cd a
% mkdir b.orig
% ln -s b.orig b
% mkdir b.orig/c
% cd .. 
% cd a/b/c
% pwd
/home/bediger/a/b/c

Isso é tudo com zsh. Segue-se o link simbólico de volta para cima da árvore, onde, se ele estivesse apenas funcionando, é usando diretórios "..", encontrando a/b.orig/c

    
por 05.07.2011 / 05:59