При запуске сценариев в bash я должен написать ./
в начале:
$ ./manage.py syncdb
Если я этого не сделаю, Я получаю сообщение об ошибке:
$ manage.py syncdb
-bash: manage.py: command not found
В чем причина? Я думал .
является псевдонимом для текущей папки, и поэтому эти два вызова должны быть эквивалентны.
Я также не понимаю, почему мне не нужен ./
при запуске приложений, например:
user:/home/user$ cd /usr/bin
user:/usr/bin$ git
( который работает без ./
)
Объяснение для /
правило
ПУТИ POSIX правило было упомянуто в: , Почему Вам нужен./(точечная наклонная черта) перед исполняемым файлом или названием сценария для выполнения его в ударе? , но я хотел бы объяснить, почему я думаю, что это - хороший дизайн более подробно.
Первый, явная полная версия правила:
/
(например, ./someprog
, /bin/someprog
, ./bin/someprog
): CWD используется, и ПУТЬ не /
(например, someprog
): ПУТЬ используется, и CWD не Теперь, предположите что выполнение:
someprog
искал бы:
Затем если Вы хотели работать /bin/someprog
от Вашего дистрибутива, и Вы сделали:
someprog
это иногда работало бы, но другие, которых это приведет к сбою, потому что Вы могли бы быть в каталоге, который содержит другое несвязанное someprog
программа.
Поэтому Вы скоро узнали бы, что это не надежно, и Вы заканчивали бы тем всегда, что использовали полные пути, когда Вы хотите использовать ПУТЬ, поэтому побеждая цель ПУТИ.
Это также, почему наличие относительных путей в Вашем ПУТИ является действительно плохой идеей. Я рассмотрение Вас, node_modules/bin
.
С другой стороны, предположите что выполнение:
./someprog
искал бы:
Затем если бы Вы просто загрузили сценарий someprog
с репозитория мерзавца и хотели выполнить его от CWD, Вы никогда не были бы уверены, что это - фактическая программа, которая работала бы, потому что, возможно, Ваш дистрибутив имеет a:
/bin/someprog
, который находится в Вас ПУТЬ от некоторого пакета, который Вы установили после питья слишком много после Рождества в прошлом году.
Поэтому еще раз, Вы были бы вынуждены всегда выполнить локальные сценарии относительно CWD с полными путями для знания то, что Вы выполняете:
"$(pwd)/someprog"
, который был бы чрезвычайно раздражающим также.
Другое правило, что Вы могли бы испытать желание придумать, будет:
относительные пути используют только ПУТЬ, полные пути только CWD
, но еще раз это вынуждает пользователей всегда использовать полные пути для сценариев непути с [1 116].
/
правило поиска пути предлагает простое для запоминания решения о проблеме:
PATH
PATH
, который делает супер легким всегда знать то, что Вы выполняете путем доверия тому, что файлы в текущем каталоге могут быть выражены или как [1 120] или somefile
, и таким образом, это дает особое значение одному из них.
Иногда, является немного раздражающим, который Вы не можете искать some/prog
относительно [1 123], но я не вижу более нормальное решение этого.