Quero pedir ao usuário do meu script bash para passar um caminho de diretório como argumento. Qual das alternativas a seguir é uma boa prática de programação?
- Exigir que o usuário insira uma barra final / (barra)
- Exigir que um usuário não insira uma barra final / (barra)
programming-practices
user-interface
bash
Rohit Agarwal
fonte
fonte
rsync
se comporta de maneira diferente de uma maneira muito importante, dependendo da presença de rastreamento/
, e, em alguns casos, você deseja normalizar a consistência e, em outros, deseja passar de maneira limpa para implementar o que o usuário disse (se eles sabia que eles estavam conversandorsync
).ls -l dir
se comporta de maneira diferentels -l dir/
sedir
é um link simbólico para um diretório.Respostas:
A melhor prática é assumir nenhum dos dois.
Se você tiver acesso aos utilitários / classes do construtor de caminhos, use-os; caso contrário, escreva seu código para aceitar qualquer formato e agir de acordo.
Nada é mais irritante para o usuário do que ter que lembrar se deve adicionar uma barra final ou não.
fonte
dirname
,basename
ereadlink
. Um problema muito comum é usar${path##*/}
como substitutobasename
, mas se o caminho terminar com uma barra que retorna uma cadeia vazia em vez do último elemento do caminho.rsync
que eu estou olhando para você)${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))
Eu também documentou-lo em uma essência para maior clareza: adicionar ou remover barra invertida em bashComo o bash ignora várias barras, você pode assumir com segurança que o usuário não inseriu uma barra no caminho e adicionar uma barra você mesmo.
é o mesmo que
Portanto, seu script pode ficar assim:
e você não precisa se preocupar se o usuário entra ou não no caminho.
fonte
bash
comportamento, o kernel faz.O falecido Jon Postel teve ótimos conselhos na seção 3.2 da RFC 760 que se aplica aqui:
fonte
Conceitualmente, a barra não faz parte do nome. A barra é apenas um delimitador entre nomes. Meu diretório home é / home / stefan e não / home / stefan /.
Se você não espera uma barra final, não falhará se houver uma, como a muniçãoQ já observou. Mas você pode facilmente colar nomes e vars, porque não precisa citar a barra:
fonte
Exigir que o diretório não deva ter uma barra final seria extremamente irritante para uso interativo no console: o preenchimento automático com o TAB adiciona automaticamente uma barra final aos diretórios.
Portanto, você certamente precisa permitir que os diretórios sejam especificados com barra final.
fonte