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

13

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

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

Obrigado e cumprimentos.

Summer_More_More_Tea
fonte
Veja superuser.com/q/314102/91047
Stéphane Gimenez

Respostas:

30

Também pode ser considerado.

No Linux, isso //não significa nada - várias barras consecutivas são reduzidas a uma, em qualquer lugar do caminho, incluindo o início. Mudar o diretório para //colocar você /, como readlink /proc/self/cwddiria a execução ; da mesma forma, /usr//local///binestá recolhido /usr/local/bin.

No entanto, alguns outros sistemas semelhantes ao Unix, por exemplo, 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árias razões, o shell bash rastreia o diretório atual por conta própria (além do rastreamento fornecido pelo sistema operacional) e possui um código que impede que a inicial //seja recolhida, para permanecer compatível com esses sistemas. O "recurso" é que o bash fornece um rastreamento mais intuitivo do diretório atual, por exemplo, ao cdentrar em um link simbólico, o bash mostrará o caminho que você espera, mesmo que o kernel pense de outra forma. O "bug" é que o bash permite //mesmo em sistemas que não o usam.

user1686
fonte
Curiosamente, zshpermite cd //, mas é inteligente o suficiente para mostrar apenas /na string de prompt.
precisa saber é o seguinte
O @BinaryZebra Bitsavers tem uma coleção de manuais antigos do Unix, incluindo o da Apollo - deve haver muitos exemplos lá. O site da TUHS também deve ter algo.
user1686
Muito obrigado, encontrei a descrição para // no manual do Bitsavers.
9

Na definição do nome do caminho POSIX:

Um nome de caminho pode opcionalmente conter uma ou mais barras finais. Várias barras sucessivas são consideradas iguais a uma barra.

Fonte

E mais precisamente como a gravidade mencionada em seu comentário abaixo, no capítulo 4.11 sobre a resolução do nome do caminho:

Um nome de caminho que começa com duas barras sucessivas pode ser interpretado de uma maneira definida pela implementação, embora mais de duas barras principais sejam tratadas como uma única barra.

Shadok
fonte
1
Uma seção mais apropriada é 4.11 Resolução do nome do caminho (último parágrafo), uma vez que o comportamento em questão aparece apenas para duas barras principais .
user1686
3

É um tipo de recurso. Se você tem um script de shell em uso e find, por exemplo, todos os caminhos são prefixados com ./ normalmente. Então, se você colocar isso em um caminho real, ele se tornará `/my/path/./appended/path, que será resolvido em / my / path / appended / path. Portanto, se não me engano, // get é interpretado como /./ e, portanto, /. É o mesmo para se você fosse para / home / user //, terminaria em / home / user /

Chuck R
fonte
1

Eu iria para o prompt exibindo "bug".

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 relacionado ao fato de que seu prompt usa o último caminho digitado válido válido para exibição, não o "pwd" real.

Engraçado de qualquer maneira;)

Ouki
fonte
Concordado - o //no prompt é um efeito colateral da sua variável de ambiente de prompt ( $PS1) - como é PS1definido?
Doug Harris
@DougHarris a $PS1variável é definida como [\u@\h \W]\$. Algum problema com a configuração?
Summer_More_More_Tea
Ímpar. Se eu tentar esse PS1, só recebo um /quando pwd = /. Gostaria de saber se você estava fazendo algum trabalho extra para obter o diretório. Está $PROMPT_COMMANDdefinido?
Doug Harris
@DougHarris Sim, esta variável está definida, cujo valor é echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Você poderia explicar um pouco mais detalhadamente? Não estou familiarizado com essas duas variáveis. Obrigado.
Summer_More_More_Tea
Leia a página man bash e procurar PS1e PROMPT_COMMAND- uso man bashem sua linha de comando ou lido online
Doug Harris
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. Portanto, seu CD não receberá nenhum erro e você não precisará alterar a variável da área de trabalho.

MY_WORKSPACE = / home / nome_do_usuário / espaço de trabalho /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

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

/ home / nome_do_usuário / espaço de trabalho // meu_projo /

phschoen
fonte