cd .. na pasta raiz

44

Por que cd .. , digitado na pasta raiz, não avisa ou falha com um erro?

Eu esperaria:

/$ cd ..
-bash: cd: ..: No such file or directory

Em vez disso, sou deixado em / . Naturalmente, isso ocorre porque .. existe em / e é simplesmente / , assim como . . Eu apenas me pergunto por que é assim.

    
por Bach 22.04.2014 / 15:32

6 respostas

53

De acordo com o Open Group (responsável pelo padrão POSIX):

Each directory has exactly one parent directory which is represented by the name dot-dot in the first directory. [...] What the filename dot-dot refers to relative to the root directory is implementation-defined. In Version 7 it refers to the root directory itself; this is the behavior mentioned in POSIX.1-2008. In some networked systems the construction /../hostname/ is used to refer to the root directory of another host, and POSIX.1 permits this behavior.

(Fonte)

    
por 22.04.2014 / 16:47
29

Você não recebe um erro porque mesmo o diretório / na verdade tem uma entrada de diretório válida para .. , mas ao contrário de outros diretórios ele aponta para o diretório em si e se comporta de maneira idêntica para . :

$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$

Como a primeira coluna informa, . , .. e / todos têm o mesmo inode-number e, portanto, são as mesmas entradas do sistema de arquivos.

Portanto, mesmo que você tenha cd .. dentro de / , fique em / .

    
por 22.04.2014 / 16:07
15

Está lá porque a remoção exigiria a criação de código de manipulação de caso especial no kernel e nas bibliotecas C. Agora você pode assumir que sempre haverá um '.' e '..' em qualquer diretório que você vá.

O único código de caso especial necessário agora está no código de montagem do sistema de arquivos, onde o código substitui o valor de inode de '..' para apontar para o diretório que contém o ponto de montagem, já que os diretórios raiz não são sempre diretórios raiz.

    
por 22.04.2014 / 23:01
1

Outra maneira de verificar o que realmente é . e .. em / :

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Como você pode ver, . e .. estão direcionados para / .

    
por 22.04.2014 / 17:47
1

Outro motivo '..' está em / é que, se não estivesse lá, criaria outro caso especial: o diretório raiz teria um link físico menor que todos os outros diretórios (todos os nós de diretório possuem n + 2 links, onde n é o número de subdiretórios diretos dentro). Isso quebraria vários programas que dependem da otimização de varreduras de diretório.

    
por 25.04.2014 / 10:40
0

É bom que esteja lá, porque senão não conseguiria enviar spam ../../../../ para chegar à raiz a partir de uma pasta. Se ele não permitisse o .. na raiz, ficaria preso contando o número de pastas no diretório de trabalho.

    
por 23.04.2014 / 07:25