Aujourd'hui lors de l'écriture de mon script shell.
Une question me vient soudain à l'esprit.
Depuis cd /target_dir
et les cd /target_dir/
deux fonctionnent.
Dois-je ajouter une barre oblique à la fin de mes variables de chemin dans un script shell?
Tels que LOG_PATH=/data/nginx/logs
contre LOG_PATH=/data/nginx/logs/
.
J'ai fait une recherche grossière sur Google, mais je n'ai pas trouvé de discussion à ce sujet, c'est peut-être trop basique?
Pour l'instant, c'est vraiment difficile pour moi de décider quel style choisir.
Mais j'ai préféré LOG_PATH=/target_dir/
un peu plus le style.
Parce que lorsque je fais la saisie semi-automatique avec bash, le résultat apparaît avec une barre oblique.
Quelle est votre opinion à ce sujet, pourquoi?
Réponses:
Selon POSIX:
la source
//
et/
avec leur nom s'afficher différemment sur l'invite bash, et en utilisantpwd
je vais montrer un chemin différent, mais leur contenu est identique! Pourquoi?bash
suit le répertoire actuel d'une manière très naïve, sous forme de chaîne. Il ajoute et supprime simplement le chemin de manière heuristique, il n'est pas lié au système de fichiers réel. Une conséquence est que vous pouvez cd dans un lien symbolique et revenir de la même manière (si bash n'a pas décidé que c'était trop et l'a réinitialisé). L'autre est ce que vous décrivez. Vous ne devez pas vous fier au suivi du shell du répertoire actuel, il n'est pas fiable.Pour être sûr, incluez la barre oblique. Cela peut entraîner plusieurs barres obliques lors de la concaténation des chemins, mais au moins vous évitez les problèmes.
Quelques exemples:
rsync
traite les chemins différemment si la barre oblique de fin est incluse (elle synchronise ce répertoire au lieu de créer un autre sous-répertoire). Les liens symboliques vers les répertoires se comportent parfois de manière inattendue lorsqu'ils n'ont pas la barre oblique de fin - au moins, l'achèvement du shell est confus. Vous ne savez jamais si la commande / le script que vous invoquez repose sur la vérification de la barre oblique pour un comportement spécial. Cela pourrait même vous éviter d'écraser quelque chose. Par exemple, si vous avez un fichier nomméfoo
, mais que vous pensez à tort qu'il s'agit d'un répertoire et que vous souhaitez y déplacer quelque chose, alors vousmv bar foo
écraserez le fichier (perte de données, catastrophe potentielle) mais vous vousmv bar foo/
plaindrez et ne ferez rien.Donc, pour conclure, dans la plupart des cas, cela n'a pas d'importance, mais vous devez utiliser la barre oblique pour vous protéger, et aussi pour rendre plus évident pour le lecteur humain ce que vous avez l'intention de faire dans un script. Un observateur occasionnel sera immédiatement sûr qu'une variable se réfère à un répertoire s'il se termine par une barre oblique, et l'utilisera correctement si elle doit être modifiée.
la source
Non tu ne devrais pas. Il ajoute une barre oblique supplémentaire inutile (
/
).exemple
dites que vous voulez exporter le
bin
répertoire de java vers votrePATH
variable,export PATH=$PATH:/opt/jre1.7.0_45/bin/
maintenant vérifiez-le,
remarquez la barre oblique supplémentaire (
/
) avant java, mais heureusement, cela fonctionne dans ce cas.la source