Обоснование /
правила 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
, но я не вижу более разумного решения этого.