Qual diretório o caminho '//' representa no Linux?

13

Quando eu quiser voltar ao diretório de nível superior no Linux digitando cd .. , eu digitei cd // . Para minha grande surpresa, nenhum erro foi relatado. Além disso, o prompt se torna username@hostname://$ . ls indica que estou no diretório raiz.

Este é um bug ou uma característica do shell? Se um recurso for // , um alias de / ? Meu shell é GNU bash, versão 4.1.5 (1) -release (i686-linux-gnu).

Obrigado e cumprimentos.

    
por Summer_More_More_Tea 13.02.2012 / 14:43

5 respostas

30

Pode ser considerado também.

No Linux, // não significa nada - várias barras consecutivas são recolhidas para um, em qualquer lugar no caminho, incluindo o início. A alteração do diretório para // coloca você em / , já que a execução readlink /proc/self/cwd diria; da mesma forma, /usr//local///bin é recolhido para /usr/local/bin .

No entanto, alguns outros sistemas semelhantes ao Unix, como o Cygwin ou o antigo Apollo Domain / OS, usam o // prefixo para caminhos de rede como //fileserver/path/to/data . O POSIX também permite isso.

Por vários motivos, o shell bash monitora o diretório atual por conta própria (além do rastreamento fornecido pelo sistema operacional) e contém código que impede que o // inicial seja recolhido , para permanecer compatível com tais sistemas. O "recurso" é que bash fornece rastreamento mais intuitivo do diretório atual, por exemplo, quando cd 'em um symlink, bash mostrará o caminho que você espera , mesmo que o kernel pense diferente. O "bug" é que bash permite // mesmo em sistemas que não o usam.

    
por 13.02.2012 / 14:55
9

Da definição do nome do caminho POSIX:

A pathname may optionally contain one or more trailing slashes. Multiple successive slashes are considered to be the same as one slash.

Fonte

E, mais precisamente, como o grawity mencionou o comentário dele abaixo, do capítulo 4.11 na resolução do nome do caminho:

A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.

    
por 13.02.2012 / 15:18
3

É um tipo de recurso. Se você tem shell script e usa find , por exemplo, todos os caminhos são prefixados com ./ normalmente. Então, se você colocar isso em um caminho real, ele se torna '/my/path/./appended/path, que resolve para / my / path / appended / path. Então, se não me engano, // get é interpretado como /./ e, portanto, /. Isto é o mesmo para se você fosse para / home / user //, você acabaria em / home / user /

    
por 13.02.2012 / 14:54
1

Eu gostaria de exibir rapidamente "bug".

Ambos os caminhos "/", "//", "//////////////////////", ... têm o mesmo significado: "/" . Você pode adicionar quantos "/" onde quiser em um caminho Unix, isso não muda seu significado.

O "bug" está mais aqui relacionado ao fato de que o seu prompt usa o último caminho digitado válido para exibição, não o "pwd" real.

Engraçado mesmo assim;)

    
por 13.02.2012 / 14:54
1

É um recurso e todos os múltiplos // serão substituídos por um único /

É útil se você tiver variáveis com caminhos como o exemplo no final. Então, o seu cd não receberia nenhum erro e você não precisa alterar o espaço de trabalho variável.

MY_WORKSPACE=/home/your_username/workspace/
MY_NEW_PROJECT=$MY_WORKSPACE/my_proj/
cd $MY_NEW_PROJECT 

o conteúdo completo da variável do projeto é

/home/your_username/workspace//my_proj/
    
por 14.02.2012 / 08:47