Justification de la /
règle POSIX PATH
La règle a été mentionnée à: Pourquoi avez-vous besoin de ./ (barre oblique) avant le nom de l'exécutable ou du script pour l'exécuter dans bash?mais je voudrais expliquer pourquoi je pense que c'est une bonne conception plus en détail.
Premièrement, une version complète explicite de la règle est:
- si le chemin contient
/
(par exemple ./someprog
, /bin/someprog
,./bin/someprog
): CWD est utilisé et est non PATH
- si le chemin ne contient pas
/
(par exemple someprog
): PATH est utilisé et CWD ne l'est pas
Supposons maintenant que l'exécution:
someprog
rechercherait:
- par rapport à CWD en premier
- par rapport à PATH après
Ensuite, si vous vouliez courir à /bin/someprog
partir de votre distribution, et vous avez fait:
someprog
cela fonctionnerait parfois, mais d'autres échoueraient, car vous pourriez être dans un répertoire qui contient un autre sans rapport someprog
programme .
Par conséquent, vous apprendrez bientôt que ce n'est pas fiable et vous finirez toujours par utiliser des chemins absolus lorsque vous souhaitez utiliser PATH, ce qui ira à l'encontre de l'objectif de PATH.
C'est aussi pourquoi avoir des chemins relatifs dans votre PATH est une très mauvaise idée. Je te regarde,node_modules/bin
.
À l'inverse, supposons que l'exécution:
./someprog
Rechercherait:
- par rapport à PATH en premier
- par rapport à CWD après
Ensuite, si vous venez de télécharger un script à someprog
partir d'un référentiel git et que vous vouliez l'exécuter à partir de CWD, vous ne seriez jamais sûr que c'est le programme réel qui s'exécuterait, car peut-être que votre distribution a un:
/bin/someprog
qui est dans votre CHEMIN à partir d'un paquet que vous avez installé après avoir trop bu après Noël l'année dernière.
Par conséquent, encore une fois, vous seriez obligé de toujours exécuter des scripts locaux relatifs à CWD avec des chemins d'accès complets pour savoir ce que vous exécutez:
"$(pwd)/someprog"
ce qui serait également extrêmement ennuyeux.
Une autre règle que vous pourriez être tenté de proposer serait:
les chemins relatifs utilisent uniquement PATH, les chemins absolus uniquement CWD
mais encore une fois, cela oblige les utilisateurs à toujours utiliser des chemins absolus pour les scripts non-PATH avec "$(pwd)/someprog"
.
La /
règle de recherche de chemin offre une solution simple à retenir au problème de:
- barre oblique: ne pas utiliser
PATH
- pas de barre oblique: utilisez uniquement
PATH
ce qui rend super facile de toujours savoir ce que vous exécutez, en s'appuyant sur le fait que les fichiers dans le répertoire en cours peuvent être exprimés soit comme ./somefile
ou somefile
, et donc il donne une signification particulière à l'un d'eux.
Parfois, c'est légèrement ennuyeux que vous ne puissiez pas rechercher par some/prog
rapport à PATH
, mais je ne vois pas de solution plus saine à cela.