unix, diferença entre o caminho que começa com '/' e '//' [duplicado]

54

No unix / linux, qualquer número de chamadas em avanço consecutivas em um caminho é geralmente equivalente a um único avanço. por exemplo.

$ cd /home/shum
$ pwd
/home/shum
$ cd /home//shum
$ pwd
/home/shum
$ cd /home///shum
$ pwd
/home/shum

No entanto, por algum motivo, duas viradas para a frente no início de um caminho absoluto são tratadas especialmente. por exemplo.

$ cd ////home
$ pwd
/home
$ cd ///
$ pwd
/
$ cd //
$ pwd
//
$ cd home//shum
$ pwd
//home/shum

Qualquer outro número de forwardslashes consecutivos em qualquer outro lugar em um patch fica truncado, mas dois no início permanecerão, mesmo se você navegar pelo sistema de arquivos em relação a ele.

Por que isso? Existe alguma diferença entre / ... e // ...?

    
por Shum 29.04.2011 / 03:48

4 respostas

54

Na maioria das vezes, os slahes repetidos em um caminho são equivalentes a uma única barra . Esse comportamento é exigido pelo POSIX e a maioria dos aplicativos segue o exemplo. A exceção é que “um nome de caminho que começa com duas barras sucessivas pode ser interpretado de uma maneira definida pela implementação” (mas ///foo é equivalente a /foo ).

A maioria dos unices não faz nada de especial com duas barras iniciais. O Linux, em particular, não funciona. O Cygwin faz: //hostname/path acessa uma unidade de rede (SMB).

O que você está vendo não é, na verdade, o Linux fazer algo de especial com // : o rastreamento de diretório atual do bash. Comparar:

$ bash -c 'cd //; pwd'
//
$ bash -c 'cd //; /bin/pwd'
/

O Bash está tomando a precaução de que o sistema operacional pode estar tratando // especialmente e mantendo-o. Dash faz o mesmo. Ksh e zsh não quando estão rodando no Linux, eu acho que (eu não verifiquei) eles têm uma configuração em tempo de compilação.

    
por 29.04.2011 / 12:11
21

Da especificação POSIX :

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.

Suponho que o Linux bash mantém esse comportamento, caso haja um uso futuro atraente.

(Eu sempre soube que o Al Viro o mantinha no lugar porque há um recurso do Plan9 que o usa, e ele gostaria de ter esse recurso no Linux, mas estou tendo problemas para encontrar esse recurso no meu Plan9 documentação.Mas, como é em bash , Al provavelmente não tem nada a ver com isso.

    
por 29.04.2011 / 04:23
9

De acordo com a definição POSIX , os caminhos que começam com uma barra dupla (/ /) "... pode ser interpretado de forma definida pela implementação, embora mais de duas barras sejam tratadas como uma única barra." Se você usa o csh, por exemplo, ele não age da mesma maneira:

% bash -c 'cd //; pwd'
//
% csh -c 'cd //; pwd'
/

O Bash parece estar armazenando o diretório, e o pwd está reportando o $ PWD, enquanto o csh parece estar usando a função getcwd() para obter o diretório atual.

    
por 07.10.2011 / 18:47
1

Todas as barras múltiplas são ignoradas e tratadas como uma única barra.

Mesmo no início, mais de duas barras são ignoradas e tratadas como uma única barra.

A barra dupla (//) no início também significa root / directory mas ainda mostra seu CWD como // quando você executa pwd.

O comando a seguir verifica se // também é root dir mesmo que /

$~> cd /
$/> pwd
/
$/> stat -c "%i" .
2
$/> cd //
$//> pwd
//
$//> stat -c "%i" .
2

Você pode ver que o inode number é 2 nos dois casos, portanto ambos são os mesmos diretórios.

    
por 29.04.2011 / 05:01