Estou escrevendo uma biblioteca para manipulação de strings de caminho Unix. Sendo esse o caso, preciso entender alguns cantos obscuros da sintaxe com os quais a maioria das pessoas não se preocuparia.
Por exemplo, o melhor que eu posso dizer, parece que foo/bar
e foo//bar
ambos apontam para o mesmo lugar.
Além disso, ~
geralmente representa o diretório inicial do usuário, mas e se ele aparecer no meio de um caminho? O que acontece depois?
Essas e várias dezenas de outras perguntas obscuras precisam ser respondidas se eu escrever um código que lide com todos os casos possíveis corretamente. Alguém sabe de uma referência definitiva que explique as regras de sintaxe exata para este material?
(Infelizmente, pesquisar termos como "Sintaxe do caminho Unix" aparece um milhão de páginas discutindo a $PATH
variável ... Caramba, estou até lutando para encontrar tags adequadas para essa pergunta!)
~
) é abordada em Como o linux lida com vários separadores de caminho (/ home //// nome_do_usuário /// arquivo) . A coisa mais próxima de uma referência normativa seria a especificação POSIX ou Single Unix - não é uma leitura fácil.Respostas:
Existem três tipos de caminhos:
foo
,foo/bar
,../a
,.
. Eles não iniciam/
e são relativos ao diretório atual do processo que faz uma chamada de sistema com esse caminho./
,/foo/bar
ou///x
. Eles começam com 1 ou 3 ou mais/
, não são relativos, são procurados a partir do/
diretório raiz.//foo
ser tratado especialmente, mas não especifica como. Alguns sistemas usam isso para casos especiais, como arquivos de rede . Tem que ser exatamente 2 barras.Além do início, as seqüências de barras agem como uma.
~
é especial apenas para o shell , é expandido pelo shell, não é especial para o sistema. Como é expandido depende do shell. Os reservatórios realizam outras formas de expansão, como globbing (*.txt
), expansão variável/$foo/$bar
ou outros. No que diz respeito ao sistema,~foo
é apenas um caminho relativo como_foo
oufoo
.Coisas a ter em mente:
foo/
não é o mesmo quefoo
. É mais próximo dofoo/.
quefoo
(especialmente sefoo
houver um link simbólico) para a maioria das chamadas de sistema na maioria dos sistemas (foo//
é o mesmo que sefoo/
fosse).a/b/../c
não é necessariamente o mesmo quea/c
(por exemplo, sea/b
for um link simbólico). Melhor não é tratar..
especialmente.a/././././b
o mesmo comoa/b
se.fonte
/
,.
e..
(?)//foo
manipulação está no Cygwin, onde é usado para caminhos UNC . Ou seja,//server/share/dir/file.txt
é um caminho legal que aponta para fora do sistema por padrão. Cygwin volta a olhar para o sistema local, se não conseguir encontrá-loserver
.Sim. Isso é comum porque o software às vezes concatena um caminho, assumindo que a primeira parte não foi finalizada com uma barra, então uma é lançada para ter certeza (o que significa que pode haver dois ou mais).
foo///bar
efoo/////bar
também aponte para o mesmo local quefoo/bar
. Uma boa função para uma biblioteca de manipulação de caminho seria aquela que reduz qualquer número de barras sequenciais para uma (exceto no início de um caminho, onde pode ser usada de maneira isenta de URL ou, como Stephane indica, para qualquer finalidade especial não especificada).Essa transformação é feita via exapansão shell e til , que só funciona se for o primeiro caractere no caminho. Se você precisa ou não lidar com isso depende do contexto. Se a biblioteca é para ser usado com programas normais que recebem, por exemplo, argumentos de linha de comando contendo um caminho, tilde expansão é feito quando vêem o caminho. A única situação que vejo como preocupante é se você está processando caminhos diretamente de um arquivo de texto.
Além disso,
~
é um caractere legal em um caminho * nix e não deve ser alterado para mais nada. De acordo com isso , os únicos caracteres que não são válidos em um nome de arquivo unix são/
(porque é o separador de caminho) e "nulo" (também conhecido como zero byte), porque geralmente são ilegais no texto.fonte
//
tecnicamente também não é isso. Tanto o URLS quanto a especificação POSIX livremente ambígua, de acordo com SC mais recente,//
podem ter sido derivados disso; nesse caso, "URL-ish" parece um rótulo adequado para a convenção (mesmo que os UNCs sejam mais antigos e até mesmo a aparência) não é intencional). Eu nunca diria que "eles são URLS", apenas isso//
ou\\
serve a um propósito "URL-ish".