Dois-je utiliser une barre oblique à la fin des variables de chemin dans le script shell ou non? [fermé]

11

Aujourd'hui lors de l'écriture de mon script shell.

Une question me vient soudain à l'esprit.

Depuis cd /target_diret 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/logscontre 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?

Zen
la source
Il n'y a pas de règle. Les deux styles de codage présentent certains avantages et certains inconvénients.
andcoz

Réponses:

9

Selon POSIX:

Définition d'un chemin:

Chaîne utilisée pour identifier un fichier. Il contient des caractères de début <barre oblique> facultatifs , suivis de zéro ou plusieurs noms de fichiers séparés par des caractères <barre oblique> . Un nom de chemin peut éventuellement contenir un ou plusieurs <slash> caractères de fin. Plusieurs caractères <slash> successifs sont considérés comme étant identiques à un <slash> , à l'exception du cas d'exactement deux caractères <slash> en tête .

MichalH
la source
@ C'est intéressant, je peux faire un cd vers //et /avec leur nom s'afficher différemment sur l'invite bash, et en utilisant pwdje vais montrer un chemin différent, mais leur contenu est identique! Pourquoi?
Zen
1
Parce que bashsuit 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.
orion
Connexes: étrange différence entre pwd et / bin / pwd .
G-Man dit `` Réintègre Monica '' le
6

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: rsynctraite 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 vous mv bar fooécraserez le fichier (perte de données, catastrophe potentielle) mais vous vous mv 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.

orion
la source
2

Non tu ne devrais pas. Il ajoute une barre oblique supplémentaire inutile ( /).

exemple

dites que vous voulez exporter le binrépertoire de java vers votre PATHvariable,

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

maintenant vérifiez-le,

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

remarquez la barre oblique supplémentaire ( /) avant java, mais heureusement, cela fonctionne dans ce cas.

Arnab
la source
J'ai vu dans ce lien qu'il y a une réponse de 31 votes dans laquelle l'auteur pense que nous devrions ajouter une barre oblique. Je suis confus. stackoverflow.com/questions/980255/…
Zen
@Zen, oui je l'ai vérifié, c'était sur le premier commentaire de votre question. Merci.
Arnab
6
Mieux vaut deux barres obliques que rien. Celui-ci est moche mais sûr ... l'autre option est bien pire et peut être dangereuse.
orion