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 /. Claro, isso ocorre desde ..que existe /e é simplesmente /, exatamente como .. Eu só me pergunto por que é assim.


6
Sem resposta, mas aqui está uma boa leitura associada, Rob Pike no G +, discutindo a origem dos arquivos de ponto.
BSD

Respostas:


53

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

Cada diretório possui exatamente um diretório pai que é representado pelo nome ponto-ponto no primeiro diretório. [...] O nome do nome do arquivo ponto-ponto em relação ao diretório raiz é definido pela implementação. Na versão 7, refere-se ao próprio diretório raiz; esse é o comportamento mencionado em POSIX.1-2008. Em alguns sistemas em rede, a construção /../hostname/ é usada para se referir ao diretório raiz de outro host, e o POSIX.1 permite esse comportamento.

(Fonte)


29

Você não recebe um erro porque mesmo o /diretório realmente possui uma entrada de diretório válida .., mas diferente de outros diretórios, ele aponta para o próprio diretório e, portanto, se comporta de maneira idêntica a .:

$ 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 indica, ., .., e /todos têm o mesmo inode-número e, portanto, são as mesmas entradas do sistema de arquivos.

Assim, mesmo se você cd ..dentro de /você apenas ficar em /.


13
A pergunta pergunta por que a ..entrada do diretório está lá.
Nick Matteo

3
A única razão que me vem à mente é que você deseja tratar /como qualquer outra pasta, incluindo uma entrada válida para ... Caso contrário, você teria que tratar de maneira /diferente em comparação com todas as outras pastas do sistema.
Dohn Joe

15

Está lá porque removê-lo exigiria a criação de código de tratamento de caso especial no kernel e nas bibliotecas C. No momento, você pode assumir que sempre haverá um '.' e '..' em qualquer diretório que você acessa.

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


Afinal, é impossível que a referência aos pais nas estruturas das árvores esteja livre de qualquer tratamento de caso especial, não é? A raiz deve ser especial por definição e qualquer tentativa de mascarar que levará a casos especiais ou confusão em outro lugar.
Musiphil

@musiphil No unix, os casos especiais aqui são embaralhados para o mountcomando e seu arquivo especial associado /etc/fstab.
luser Droog

1

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

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Como você pode ver, .e ..é apontado /.


1

Outro motivo para '..' 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 têm n + 2 links, em que n é o número de subdiretórios diretos internos). Isso interromperia vários programas que dependem da otimização das verificações de diretório.


0

É bom que esteja lá, porque, caso contrário, eu não seria capaz ../../../../de enviar spam para obter a raiz de uma pasta. Se não permitisse a ..raiz, eu ficaria preso contando o número de pastas no diretório que está funcionando.


10
O que há de errado cd /?
Bach

@Bach Às vezes, o teclado é mais divertido. Além disso, em muitas circunstâncias, você não está tentando acessar a raiz. Nesse caso, o uso ../é melhor. Também faço muitas operações de arquivo em PHP, onde não posso fazer /por vários motivos.
Skylar Ittner

2
O outro lado é que talvez você acidentalmente insira muitos se ../opere (ou remova) um arquivo que não pretendia sem erro.
Jamesdlin #

4
Repetir ../mais vezes do que o necessário e desejar que ele funcione como pretendido parece um erro lógico (inativo) para mim, mesmo que o sistema de arquivos aparentemente permita.
Musiphil

@musiphil digitar espaços entre comandos - é um erro lógico (suposição de que todos os espaços entre tail -f | grep sejam obrigatórios). A maioria das pessoas unix sofre com isso. Digitar '../ ..' parece um problema comum ao Windows (por padrão, o cmd inicia em X: \ Windows e você deve enviar spam. Desde o início). Por que curar um pequeno problema quando existe um maior? (espaços)
kagali-san
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.