A barra (/) é parte do nome do diretório raiz do Linux?

44

A barra ( / ) realmente faz parte do nome do diretório raiz do Linux? Ou é apenas um símbolo para isso?

Que tal /etc e assim por diante?

Atualizar

Suponha que /dev/sda2 seja o dispositivo de bloco de um diretório raiz do Linux.

$ sudo debugfs /dev/sda2
debugfs 1.44.1 (24-Mar-2018)
debugfs:  pwd
[pwd]   INODE:      2  PATH: /
[root]  INODE:      2  PATH: /
debugfs:  stat /
Inode: 2   Type: directory    Mode:  0755   Flags: 0x80000
Generation: 0    Version: 0x00000000:00000077
User:     0   Group:     0   Project:     0   Size: 4096
File ACL: 0
Links: 25   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5b13c9f1:3f017990 -- Sun Jun  3 15:28:57 2018
 atime: 0x5b13ca0f:3b3ee380 -- Sun Jun  3 15:29:27 2018
 mtime: 0x5b13c9f1:3f017990 -- Sun Jun  3 15:28:57 2018
crtime: 0x5aad1843:00000000 -- Sat Mar 17 16:59:39 2018
Size of extra inode fields: 32
EXTENTS:
(0):9249

Portanto, há um diretório lá, o inode # 2, mas não tem nome.

    
por mlibre 24.07.2016 / 17:43

4 respostas

59

O padrão POSIX.1-2008 diz

A pathname consisting of a single / shall resolve to the root directory of the process. A null pathname shall not be successfully resolved.

O padrão ainda faz uma distinção entre nomes de arquivos e nomes de caminho . / é o nome do caminho para o caminho do diretório raiz. O nome do diretório é "o diretório raiz", mas no sistema de arquivos ele é sem nome, ele não possui um nome de arquivo. Se tivesse um nome de arquivo, esse nome seria uma entrada de diretório no diretório acima do diretório raiz, e não existe tal diretório.

Para maior clareza: / não é o nome do diretório raiz, mas o caminho para ele, seu nome do caminho .

/etc é outro nome de caminho. É o nome do caminho absoluto para o diretório etc . O nome do diretório nesse caminho é etc (seu nome de arquivo é etc ).

/usr/local/bin/curl é o nome do caminho do arquivo executável curl da mesma forma que /etc é o nome do caminho do diretório etc .

    
por 24.07.2016 / 17:58
36

barra é um separador ; diretório nomes não incluem separadores, mas caminhos completos incluem os separadores.

Portanto, o "nível raiz" / não tem nome . Na maioria dos sistemas do tipo Unix, isso é tratado como um caso especial como . e .. (embora, é claro, não haja diferença entre os dois no nível raiz).

A nomenclatura pode diferir. POSIX.1-2017, por exemplo, lista algumas definições comumente usadas:

  • 3.2 Nome do caminho absoluto

    A pathname beginning with a single or more than two <slash> characters; see also Pathname.

  • 3.271 Pathname

    A string that is used to identify a file. In the context of POSIX.1-2008, a pathname may be limited to {PATH_MAX} bytes, including the terminating null byte. It has optional beginning <slash> characters, followed by zero or more filenames separated by <slash> characters. A pathname can optionally contain one or more trailing <slash> characters. Multiple successive <slash> characters are considered to be the same as one <slash>, except for the case of exactly two leading <slash> characters.

    Note: If a pathname consists of only bytes corresponding to characters from the portable filename character set (see Portable Filename Character Set), <slash> characters, and a single terminating <NUL> character, the pathname will be usable as a character string in all supported locales; otherwise, the pathname might only be a string (rather than a character string). Additionally, since the single-byte encoding of the <slash> character is required to be the same across all locales and to not occur within a multi-byte character, references to a <slash> character within a pathname are well-defined even when the pathname is not a character string. However, this property does not necessarily hold for the remaining characters within the portable filename character set.

  • 3.272 Componente de nome de caminho

    See Filename in Filename.

  • 3.170 Filename

    A sequence of bytes consisting of 1 to {NAME_MAX} bytes used to name a file. The bytes composing the name shall not contain the <NUL> or <slash> characters. In the context of a pathname, each filename shall be followed by a <slash> or a <NUL> character; elsewhere, a filename followed by a <NUL> character forms a string (but not necessarily a character string). The filenames dot and dot-dot have special meaning. A filename is sometimes referred to as a "pathname component". See also Pathname.

Então ... se você está procurando por esclarecimento , essa pode não ser sua primeira parada. Tutoriais como este Conceitos do UNIX são úteis, por exemplo , apontando que "nome de caminho completo" é sinônimo de nome de caminho "absoluto" ".

    
por 24.07.2016 / 17:49
18

No Unix, os arquivos (e diretórios são apenas arquivos) não possuem "nomes". Links têm nomes, links são entradas em um diretório que mapeia nomes para arquivos.

Você pode dizer que vincula nomes a arquivos, mas note: isso implica que um arquivo pode ter mais de um nome, já que pode ter mais de um link.

Como o diretório raiz é, bem, o diretório-raiz, não existe um diretório "superior" no qual possa haver um link para ele, portanto, não pode haver um nome associado a ele. Teoricamente, seria possível adicionar um link ao diretório raiz dentro de algum outro diretório, mas a maioria dos Unices proíbe a adição de links a diretórios existentes, porque pode levar a ciclos na hierarquia do sistema de arquivos (que na verdade é um grafo direcionado) e detectar ciclos em um gráfico é caro, mas não detectá-los pode levar à recursão infinita ao tentar resolver nomes dentro do kernel.

Então, basicamente, o diretório raiz não tem nome, porque não há diretório acima dele dentro do qual possamos gravar o nome.

Como foi apontado em outras respostas, precisamos distinguir entre um nome e um caminho (nome). O diretório raiz pode ser referenciado pelo caminho (nome) / .

    
por 25.07.2016 / 00:54
7

O uso da palavra "nome" é um pouco flexível; pode referir-se a um "nome completo do caminho"; pode referir-se à "entrada de diretório"; poderia se referir ao "nome do arquivo" passado para várias funções ou rotinas.

Portanto, por exemplo, /etc/foo e /var/tmp/../../etc/foo e /tmp/../../../../../../foo são todas as maneiras de se referir ao mesmo arquivo; todos eles são nomes , como é foo quando no diretório /etc .

Então, vamos voltar ao básico.

Um nome de arquivo no unix é feito de componentes separados pelo separador de diretório / . Praticamente a única restrição nos componentes é que eles não podem conter os caracteres / ou NUL; qualquer outra coisa é permitida.

Portanto, o "nome completo do caminho qualificado" de /etc é a string completa: /etc . Isso significa que ele tem o componente etc no diretório raiz.

Similarmente, /x/y/z/foo teria o componente foo no diretório /x/y/z .

Agora, o diretório raiz é único, pois não possui nenhum componente em um diretório pai; apenas tem o nome completo do caminho como seu nome: / .

    
por 24.07.2016 / 17:54