Обоснование /правила POSIX PATH
Правило упоминалось здесь: зачем вам нужен ./ (точка-косая черта) перед именем исполняемого файла или скрипта, чтобы запустить его в bash? но я хотел бы объяснить, почему я думаю, что это хороший дизайн более подробно.
Во-первых, полная версия правила:
- если путь содержит
/(например ./someprog, /bin/someprog, ./bin/someprog): УХО используется и PATH не
- если путь не содержит
/(например someprog): PATH используется, а CWD - нет
Теперь предположим, что работает:
someprog
будет искать:
- относительно CWD сначала
- относительно PATH после
Затем, если вы хотите запустить /bin/someprogиз своего дистрибутива, и вы сделали:
someprog
иногда это будет работать, а в других - не получится, потому что вы можете находиться в каталоге, содержащем другую не связанную someprogпрограмму.
Таким образом, вы скоро узнаете, что это ненадежно, и в конечном итоге вы всегда будете использовать абсолютные пути, когда захотите использовать PATH, что приведет к поражению цели PATH.
Именно поэтому наличие относительных путей в вашем PATH - действительно плохая идея. Я смотрю на тебяnode_modules/bin .
И наоборот, предположим, что работает:
./someprog
Будет искать:
- по отношению к PATH первым
- относительно CWD после
Затем, если вы просто скачали скрипт someprogиз репозитория git и хотели запустить его из CWD, вы никогда не были бы уверены, что это именно та программа, которая будет запускаться, потому что, возможно, ваш дистрибутив имеет:
/bin/someprog
который находится в вашем ПУТИ из какого-то пакета, который вы установили после того, как выпили слишком много после Рождества в прошлом году.
Поэтому, опять же, вы будете вынуждены всегда запускать локальные сценарии относительно CWD с полными путями, чтобы знать, что вы запускаете:
"$(pwd)/someprog"
что было бы крайне раздражающим.
Другое правило, которое вы могли бы соблазнить, было бы:
относительные пути используют только PATH, абсолютные пути только CWD
но еще раз это заставляет пользователей всегда использовать абсолютные пути для сценариев, не относящихся к PATH "$(pwd)/someprog".
/Правило пути поиска предлагает простое вспомнить решение о проблеме:
- косая черта: не использовать
PATH
- без косой черты: только использовать
PATH
что позволяет очень легко всегда знать, что вы выполняете, полагаясь на то, что файлы в текущем каталоге могут быть выражены как ./somefileили somefile, и поэтому придает особое значение одному из них.
Иногда немного раздражает, что вы не можете искать по some/progотношению к PATH, но я не вижу более разумного решения этого.