O que exatamente é ponto ponto (..)? Por que seu comportamento é diferente com links simbólicos?

14

Estou tentando entender a natureza de ..(ponto duplo). Parece apontar para diferentes alvos, dependendo de como você o acessa.

Exemplo:-

    /outer/
        middle/
            inner/
        inner --> ./middle/inner/

Agora, /outer/middle/inner/..leva a /outer/middle/, mas se eu acessá-lo através do link simbólico, /outer/inner/..leva a /outer/. Parece que existem dois diferentes ..aqui.

O que é ..exatamente? link simbólico? link rígido? Ou é gerado dinamicamente, dependendo do caminho quando o diretório é acessado? Ou talvez meu entendimento dos links simbólicos esteja errado.

Editar:

Outra observação relacionada

    /outer/
        middle/
            file
            inner/
               f --> ./../file
        inner --> ./middle/inner/

Agora, se eu tentar acessar o arquivo através /outer/inner/fdele, funciona. Mas não deve, pois /outer/inner/../filenão aponta para um arquivo. o arquivo está em /outer/middle/inner/... Isso parece contradizer o comportamento acima !?

user98456
fonte
Observe que links simbólicos não são atalhos; eles são mais como ponteiros.
wizzwizz4

Respostas:

34

..é um link físico para o diretório pai, criado como parte da entrada do diretório.

Se você emitir ls -ailem cada um desses diretórios, verá que as seguintes entradas têm todas a mesma inode(primeiro campo) e contagem de links físicos (terceiro campo):

  • ..ao executar ls -aileminner
  • .ao executar ls -ailemmiddle
  • middleao executar ls -ailemouter

Agora, / outer / middle / inner / .. leva a / outer / middle /, mas se eu acessá-lo através do link simbólico, / outer / inner / .. leva a / outer /. Parece que existem dois diferentes .. aqui.

Há uma ..entrada em inner. Se o seu diretório de trabalho atual for outer, você verá os mesmos resultados (uma lista de diretórios middle) de

  • ls -al inner/..
  • ls -al middle/inner/..

A única situação em que "acessar" ..através do link simbólico deve fornecer um comportamento diferente é se você cdpara innerusando o link simbólico, de modo que sua lógica de diretório de trabalho ( pwd -L) difere do seu físico diretório de trabalho ( pwd -P). Nesse caso, cd ..você voltará outer não porque existe uma ..entrada diferente , mas porque seu shell está acompanhando seu diretório de trabalho lógico e exibindo um nível, em vez de fazer referência à ..entrada real inner.

Essa é uma conveniência fornecida por, por exemplo, bashcomo parte do cdcomando interno. Você pode substituir isso pedindo que ele mude para a ..entrada real com

cd -P ..

onde -Pinstrui cd(como pwdacima) a usar o caminho físico.

user4556274
fonte
Aha, a confusão vem de usar cdpara verificar. Portanto, corrija-me se estiver errado, ..sempre aponte para o pai físico. Se um link simbólico usa, ..ele será direcionado ao pai (físico) real. A confusão acontece apenas com cda entrada em diretórios.
user98456
Isso também explica o comportamento dos segundos. Muito obrigado.
user98456
3
@ Theophrastus, ls -laimostra que /..é o próprio diretório raiz novamente (aka /. ou /). A menos que o sistema de arquivos esteja quebrado, não deve haver outro caso em que . == ..; mesmo quando um fs é montado em algum lugar, ele obtém o correto ..do pai (temporário) (para que haja alguma mágica acontecendo lá, ..não é apenas uma entrada estática simples na tabela do sistema de arquivos).
AnoE