Обґрунтування /
правила POSIX PATH
Правило було згадано в: Чому для запуску його в bash потрібно. але я хотів би пояснити, чому я думаю, що це хороший дизайн більш докладно.
По-перше, явна повна версія правила:
- якщо шлях містить
/
(наприклад ./someprog
, /bin/someprog
,./bin/someprog
): ВУХО використовується і PATH НЕ
- якщо шлях не містить
/
(наприклад someprog
): використовується PATH, а CWD - ні
Тепер припустимо, що працює:
someprog
шукав би:
- по відношенню до ХСЗ спочатку
- відносно PATH після
Тоді, якщо ви хотіли бігти /bin/someprog
зі свого дистрибутива, ви зробили:
someprog
Іноді це може спрацювати, але інші не зможуть, тому що ви можете опинитися в каталозі, який містить іншу незв'язану someprog
програму.
Таким чином, ви незабаром дізнаєтесь, що це не є надійним, і ви в кінцевому підсумку завжди використовуєте абсолютні шляхи, коли хочете використовувати PATH, тому перемагаючи мету PATH.
Це також, чому наявність відносних шляхів у вашій PATH - це дійсно погана ідея. Я дивлюся на тебеnode_modules/bin
,.
І навпаки, припустимо, що працює:
./someprog
Шукав би:
- відносно перших
- відносно ХСН після
Тоді, якби ви просто завантажили скрипт someprog
із сховища git і хотіли запустити його з CWD, ви ніколи не будете впевнені, що це фактична програма, яка запускається, тому що, можливо, ваш дистрибутив має:
/bin/someprog
що є у вас ПАТИ з якогось пакета, який ви встановили після того, як занадто багато пили після Різдва минулого року.
Отже, ще раз, ви будете змушені завжди запускати локальні сценарії відносно CWD з повними шляхами, щоб знати, що ви працюєте:
"$(pwd)/someprog"
що також буде дуже дратує.
Ще одне правило, яке ви могли б спокусити:
відносні шляхи використовують тільки PATH, абсолютні шляхи лише CWD
але ще раз це змушує користувачів завжди використовувати абсолютні шляхи для сценаріїв, що не належать до PATH "$(pwd)/someprog"
.
/
Правило шляху пошуку пропонує просте згадати рішення про проблему:
- нахил: не використовувати
PATH
- без косої риски: використовувати тільки
PATH
завдяки чому завжди легко знати, що ви працюєте, покладаючись на те, що файли в поточному каталозі можна виражати як ./somefile
або somefile
, і тому він надає особливого значення одному з них.
Іноді трохи дратує те, що ви не можете шукати some/prog
відносно PATH
, але я не бачу більш безпечного рішення для цього.