Por que o pwd não é atualizado após a remoção do diretório?

2

Eu tentei um pequeno experimento onde criei 2 pastas Dir1 e Dir2 dentro do meu diretório Desktop, de tal forma que Dir1 é pai de Dir2. / home / username / Desktop / Dir1 / Dir2

Então, eu uso cd para definir meu pwd como / home / username / Desktop / Dir1 / Dir2. Em seguida, usei rm -r / home / username / Desktop / Dir1 para remover o Dir1. Agora, se eu usar o pwd, ele ainda mostrará que ele é / home / username / Desktop / Dir1 / Dir2, que agora não existe. Também neste momento se eu uso ls ou cd .. ele gera um erro dizendo 'Não é possível acessar / home / username / Desktop / Dir1 / Dir2: nenhum arquivo ou diectory', o que é absolutamente verdade, mas eu estava pensando que este problema gerado porque de pwd não ficar atualizando após a exclusão da pasta.

A solução para isso também é simples, tanto quanto eu posso pensar, você pode ir ao diretório pai e, em seguida, excluir o diretório solicitado.

Eu quero saber se existe alguma razão específica para o pwd não ser atualizado, a minha solução está correta e / ou acabei de encontrar um bug?

    
por Ashish 16.10.2016 / 13:59

1 resposta

4

Na verdade, Dir2 existe , mas o nome Dir2 não. Confuso? :) O diretório atual do shell ainda é o diretório referido pelo nome Dir2 , e isso mantém o diretório ainda por perto. Isso é análogo a arquivos anônimos. Normalmente, quando os arquivos contagem de links vão para zero, o arquivo é excluído e o inode é liberado. No entanto, se um processo ainda tiver o arquivo aberto, o kernel não excluirá o arquivo até que o processo feche o arquivo, explicitamente ou implicitamente, saindo do arquivo. No caso de Dir2 , o shell ainda está tendo o diretório "aberto", desde que ele não altere seu diretório atual.

O que está desaparecido são os nomes Dir1 no catálogo Desktop e toda a hierarquia de nomes abaixo, incluindo as entradas . e .. . O diretório anteriormente conhecido como Dir1 também desapareceu (assumindo que nenhum outro processo o possui como diretório atual). Arquivos e diretórios no nível inode não formam uma hierarquia, ou seja, não há links de inodes para entradas pai, filho ou irmão. A hierarquia é construída separadamente por entradas de diretório, que são essencialmente pares (nome, inode), apontando para arquivos e outros diretórios.

Após essa longa introdução, podemos reformular sua pergunta original para que ela leia: "por que o shell não altera seu diretório atual para outra coisa, quando a entrada de diretório Dir2 é removida de Dir1 ?" Bem, uma razão é que a casca nem sabe disso. Algum outro processo executou o programa rm e removeu os diretórios, mas não há mecanismo pelo qual o shell seria informado sobre isso. Segundo, qual diretório o shell escolheria como seu novo diretório atual? O diretório é alterado usando a chamada do sistema chdir , que usa uma cadeia contendo o novo diretório como argumento. O shell poderia tentar um chdir("..") , mas como vimos acima, nós já destruímos a entrada .. ! Em terceiro lugar, por que o shell deve alterar o diretório atual? Não tem nenhuma razão para fazê-lo, é confortável onde está, e não tem o hábito de mudar magicamente os diretórios sem ser explicitamente instruído a fazê-lo.

Concedido, a situação é meio patológica, mas cabe ao usuário evitá-la.

    
por 16.10.2016 / 23:04