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.


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.


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.


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 /


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;)


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 /

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.