Je veux demander à l'utilisateur de mon script bash de passer un chemin de répertoire en argument. Lequel des énoncés suivants est une bonne pratique de programmation?
- Exiger que l'utilisateur saisisse une barre oblique / (barre oblique)
- Exiger qu'un utilisateur n'entre pas de fin / (barre oblique)
programming-practices
user-interface
bash
Rohit Agarwal
la source
la source
rsync
se comporte différemment d'une manière très importante en fonction de la présence de fin/
, et donc dans certains cas, vous voudriez normaliser pour la cohérence, et dans d'autres vous voudriez passer proprement pour implémenter ce que l'utilisateur a dit (s'ils savait qu'ils parlaientrsync
).ls -l dir
se comporte différemment à s'est un lien symbolique vers un répertoire.ls -l dir/
dir
Réponses:
La meilleure pratique consiste à ne supposer ni l'un ni l'autre.
Si vous avez accès à des utilitaires / classes de générateur de chemin, utilisez-les, sinon écrivez votre code pour accepter l'un ou l'autre format et agissez en conséquence.
Rien de plus ennuyeux pour l'utilisateur que de devoir se souvenir d'ajouter ou non une barre oblique de fin.
la source
dirname
,basename
etreadlink
. Un problème très courant consiste à${path##*/}
remplacerbasename
, mais si le chemin se termine par une barre oblique qui renvoie une chaîne vide au lieu du dernier élément de chemin.rsync
je vous regarde)${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))
je l'ai également documenté dans un sens pour plus de clarté: ajouter ou supprimer une barre oblique de fin dans bashÉtant donné que bash ignore plusieurs barres obliques, vous pouvez supposer en toute sécurité que l'utilisateur n'a pas entré de barre oblique de fin dans le chemin d'accès et ajouter une barre oblique vous-même.
c'est pareil
Votre script pourrait donc ressembler à ça:
et vous n'avez pas à vous soucier de savoir si l'utilisateur entre ou non dans le chemin.
la source
bash
comportement, le noyau le fait.Le regretté Jon Postel a donné d'excellents conseils dans la section 3.2 de la RFC 760 qui s'applique ici:
la source
Conceptuellement, la barre oblique ne fait pas partie du nom. La barre oblique n'est qu'un délimiteur entre les noms. Mon répertoire personnel est / home / stefan et non / home / stefan /.
Si vous ne vous attendez pas à une barre oblique finale, vous n'échouerez pas s'il y en a une, comme ammoQ l'a déjà noté. Mais vous pouvez facilement coller des noms et des variables, car vous n'avez pas à citer la barre oblique:
la source
Exiger que le répertoire ne contienne pas de barre oblique de fin serait extrêmement ennuyeux pour une utilisation interactive sur la console: la complétion automatique avec TAB ajoute automatiquement une barre oblique de fin pour les répertoires.
Vous devez donc certainement autoriser que les répertoires soient spécifiés avec une barre oblique de fin.
la source