
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 (deman 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
ls
deWikipé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
dir
edir/
serão adicionados/
quando necessário, por exemplo, para se referir a um arquivo dentro dedir
.
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 source
e target
, o comando rsync -a source target
copiaria tudo para target/source
. Mas com uma barra final, rsync -a source/ target
copia o conteúdo source
diretamente target
, sem criar um target/source
subdiretó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 root
para um local, não faz diferença, pois nginx
sabe 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_uri
reescrever ou fazer proxy).
Em geral, isso não faz diferença quando se trata de plataformas *nix. Há poucas exceções:
rsync
se 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.