Diferença entre incluir/no final de um caminho de diretório e omiti-lo

Diferença entre incluir/no final de um caminho de diretório e omiti-lo

Só estou me perguntando se há alguma diferença no que acontece quando saio/no final de um caminho de arquivo, por exemplo:

root /var/www/website.com/

E omitindo como:

root /var/www/website.com

Como isso é tratado ou há alguma diferença?

Responder1

A barra final após o nome de um diretório é importante em alguns programas e não em outros. Por exemplo:

  • No git, /após nome do arquivo significa apenas diretório e não um único arquivo (de man 5 gitignore):

    Se o padrão terminar com uma barra, ele será removido para fins da descrição a seguir, mas apenas encontrará uma correspondência com um diretório. Em outras palavras, foo/ corresponderá a um diretório foo e aos caminhos abaixo dele, mas não corresponderá a um arquivo normal ou a um link simbólico foo (isso é consistente com a maneira como o pathspec funciona em geral no git).

  • Em lsdeWikipédia):

    Quando uma listagem de diretório de um link simbólico que aponta para um
    diretório é solicitada, apenas o link em si será exibido. Para
    obter uma listagem do diretório vinculado, o caminho deve
    incluir um caractere separador de diretório à direita ('/', barra).

  • ainda alguns outros programas que não me lembro agora (principalmente macros Emacs que vi) que esperam apenas um diretório e não um arquivo regular aceitarão ambos dire dir/serão adicionados /quando necessário, por exemplo, para se referir a um arquivo dentro de dir.

Não sei como o nginx funciona, mas vejaresposta de Muru.

Responder2

Em geral, um caminho que não possui uma barra final é ambíguo: pode ser um arquivo ou um diretório. Um caminho com barra final só pode ser um diretório. A maioria dos shells fornece a barra final automaticamente ao usar o preenchimento de tabulação.

Isso não significa que você deva sempre usar uma barra final; na verdade, alguns programas não permitem seu uso. Como os outros afirmaram, depende do contexto. Cada programa interpreta isso de maneira diferente.

Um exemplo em que uma barra final faz uma grande diferença é rsync.

Dados os diretórios sourcee target, o comando rsync -a source targetcopiaria tudo para target/source. Mas com uma barra final, rsync -a source/ targetcopia o conteúdo sourcediretamente target, sem criar um target/sourcesubdiretório.

Muitas vezes fico confuso com esse comportamento, então, em vez de confiar na criação implícita de subdiretórios, prefiro escrevê-lo. Às vezes, até uso um final /.para garantir que nenhum subdiretório indesejado seja criado, pois o subdiretório .já está lá.

Responder3

O contexto realmente importa. Pois nginx, ao especificar o rootpara um local, não faz diferença, pois nginxsabe que é um diretório. No entanto, poderá fazer diferença noutros locais, uma vez quebarras duplas podem causar problemas em URLs(isto é, se você fizer algo como blah/$request_urireescrever ou fazer proxy).

Em geral, isso não faz diferença quando se trata de plataformas *nix. Há poucas exceções:

  • rsyncse comporta de maneira diferente dependendo se o caminho do diretório de origem tem uma barra final ou não.Um bom exemplo de como o rsync trata as barras finais.
  • Adicionar uma barra final pode fazer com que um aplicativo saiba que está procurando um diretório, em vez de criar um arquivo acidentalmente:

    cp blah non-existent-directory
    cp blah non-existent-directory2/
    
  • Semelhante ao acima, no globbing, pode ser usado para forçar a expansão apenas para diretórios:

    $ printf "%s\n" * | wc -l
    26
    $ printf "%s\n" */ | wc -l
    20
    

    Desculpe o exemplo. Isso é feito na raiz de uma instalação padrão do Ubuntu, portanto nenhum nome estranho foi prejudicado durante a execução deste exemplo.

Responder4

Se você digitar no shell:

    caminho do CD/algum diretório

Ele move seu diretório atual paracaminho/algum diretório.
Mas se você digitar:

    caminho do CD/somedir/

Ele imprime:

    bash: cd: path/somedir/: Esse arquivo ou diretório não existe

Talvez porque o /caractere signifique que o caminho não está completo, mas continua, então se você não colocar nada depois é o mesmo que fazer referência a um arquivo inexistente.

informação relacionada