Devo usar uma barra no final das variáveis ​​de caminho no shell script ou não? [fechadas]


11

Hoje ao escrever meu script de shell.

Uma pergunta de repente vem à minha mente.

Desde cd /target_dire 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/logsversus 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ê?



Não existe regra. O estilo de codificação tem algumas vantagens e algumas desvantagens.
andcoz

Respostas:


8

De acordo com o POSIX:

Definição de um nome de caminho:

Uma sequência usada para identificar um arquivo. Possui caracteres iniciais <barra> opcionais , seguidos por zero ou mais nomes de arquivos separados por caracteres <barra> . Um nome de caminho pode opcionalmente conter um ou mais caracteres <barra> à direita . Vários caracteres <barra> sucessivos são considerados iguais a um <barra> , exceto no caso de exatamente dois caracteres <barra> à esquerda .


@ É interessante que eu possa fazer um cd para //e /com o nome deles ser exibido de maneira diferente no prompt do bash, e, usando o recurso pwd, mostrarei um caminho diferente, mas o conteúdo é idêntico! Por quê?
Zen


1
Porque bashrastreia 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.
orion


6

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: rsynctrata 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 nomeado foo, mas pensa erroneamente que é um diretório e deseja mover algo nele, ele mv bar foosubstituirá o arquivo (perda de dados, catástrofe potencial), mas mv 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.


2

Não você não deveria. Ele adiciona uma barra extra desnecessária ( /).

exemplo

digamos que você deseja exportar o bindiretório java para sua PATHvariável,

export PATH=$PATH:/opt/jre1.7.0_45/bin/

agora verifique

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

observe a barra extra ( /) antes do java, mas felizmente funciona nesse caso.


Eu vi neste link uma resposta de 31 votos na qual o autor acha que devemos adicionar uma barra. Estou confuso. stackoverflow.com/questions/980255/…
Zen

@ Zen, sim, eu verifiquei, foi no primeiro comentário da sua pergunta. Obrigado.
Arnab 29/06

6
Melhor duas barras do que nenhuma. Este é feio, mas seguro ... a outra opção é muito pior e pode ser perigosa.
orion
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.