Hoje ao escrever meu script de shell.
Uma pergunta de repente vem à minha mente.
Desde cd /target_dir
e cd /target_dir/
ambos os trabalhos.
Devo adicionar uma barra no final das minhas variáveis de caminho em um script de shell?
Como LOG_PATH=/data/nginx/logs
versus LOG_PATH=/data/nginx/logs/
.
Eu fiz uma pesquisa bruta no google, mas não encontrei discussão sobre isso, talvez seja muito básico?
Por enquanto, é realmente difícil para mim decidir qual estilo escolher.
Mas eu preferi o LOG_PATH=/target_dir/
estilo um pouco mais.
Porque quando estou completando automaticamente com o bash, aparece o resultado com barra.
Qual a sua opinião sobre isso, por quê?
shell
shell-script
zen
fonte
fonte
Respostas:
De acordo com o POSIX:
fonte
//
e/
com o nome deles ser exibido de maneira diferente no prompt do bash, e, usando o recursopwd
, mostrarei um caminho diferente, mas o conteúdo é idêntico! Por quê?bash
rastreia o diretório atual de uma maneira muito ingênua, como uma string. Ele apenas anexa e remove do caminho heuristicamente, não vincula ao sistema de arquivos real. Uma conseqüência é que você pode entrar em um link simbólico e voltar da mesma maneira (se o bash não decidir que isso é demais e o reinicializar). O outro é o que você descreve. Você não deve confiar no rastreamento do shell do diretório atual, pois ele não é confiável.Para estar do lado seguro, inclua a barra. Isso pode levar a várias barras ao concatenar os caminhos, mas pelo menos você evita problemas.
Alguns exemplos:
rsync
trata os caminhos de maneira diferente se a barra final estiver incluída (sincroniza esse diretório em vez de criar outro subdiretório). Links simbólicos para diretórios às vezes se comportam de maneira inesperada quando não possuem a barra final - pelo menos a conclusão do shell fica confusa. Você nunca sabe se o comando / script que você invoca se baseia na verificação da barra para algum comportamento especial. Pode até evitar que você substitua algo. Por exemplo, se você tem um arquivo nomeadofoo
, mas pensa erroneamente que é um diretório e deseja mover algo nele, elemv bar foo
substituirá o arquivo (perda de dados, catástrofe potencial), masmv bar foo/
apenas reclamará e não fará nada.Portanto, para concluir, na maioria dos casos isso não importa, mas você deve usar a barra para se proteger e também para tornar mais óbvio para o leitor humano o que você pretendia fazer em um script. Um observador casual terá a certeza imediata de que uma variável se refere a um diretório se terminar com uma barra e a usará corretamente se precisar ser modificada.
fonte
Não você não deveria. Ele adiciona uma barra extra desnecessária (
/
).exemplo
digamos que você deseja exportar o
bin
diretório java para suaPATH
variável,export PATH=$PATH:/opt/jre1.7.0_45/bin/
agora verifique
observe a barra extra (
/
) antes do java, mas felizmente funciona nesse caso.fonte