Зачем вам нужно ./ (точка-косая черта) перед именем исполняемого файла или сценария, чтобы запустить его в bash?

При запуске сценариев в bash я должен написать ./ в начале:

$ ./manage.py syncdb

Если я этого не сделаю, Я получаю сообщение об ошибке:

$ manage.py syncdb
-bash: manage.py: command not found

В чем причина? Я думал . является псевдонимом для текущей папки, и поэтому эти два вызова должны быть эквивалентны.

Я также не понимаю, почему мне не нужен ./ при запуске приложений, например:

user:/home/user$ cd /usr/bin
user:/usr/bin$ git

( который работает без ./ )

272
задан Charles Duffy 31 January 2018 в 11:07
поделиться

1 ответ

Объяснение для / правило

ПУТИ POSIX правило было упомянуто в: , Почему Вам нужен./(точечная наклонная черта) перед исполняемым файлом или названием сценария для выполнения его в ударе? , но я хотел бы объяснить, почему я думаю, что это - хороший дизайн более подробно.

Первый, явная полная версия правила:

  • , если путь содержит / (например, ./someprog, /bin/someprog, ./bin/someprog): CWD используется, и ПУТЬ не
  • , если путь не содержит / (например, someprog): ПУТЬ используется, и CWD не

Теперь, предположите что выполнение:

someprog

искал бы:

  • относительно CWD сначала
  • относительно ПУТИ после

Затем если Вы хотели работать /bin/someprog от Вашего дистрибутива, и Вы сделали:

someprog

это иногда работало бы, но другие, которых это приведет к сбою, потому что Вы могли бы быть в каталоге, который содержит другое несвязанное someprog программа.

Поэтому Вы скоро узнали бы, что это не надежно, и Вы заканчивали бы тем всегда, что использовали полные пути, когда Вы хотите использовать ПУТЬ, поэтому побеждая цель ПУТИ.

Это также, почему наличие относительных путей в Вашем ПУТИ является действительно плохой идеей. Я рассмотрение Вас, node_modules/bin .

С другой стороны, предположите что выполнение:

./someprog

искал бы:

  • относительно ПУТИ сначала
  • относительно CWD после

Затем если бы Вы просто загрузили сценарий someprog с репозитория мерзавца и хотели выполнить его от CWD, Вы никогда не были бы уверены, что это - фактическая программа, которая работала бы, потому что, возможно, Ваш дистрибутив имеет a:

/bin/someprog

, который находится в Вас ПУТЬ от некоторого пакета, который Вы установили после питья слишком много после Рождества в прошлом году.

Поэтому еще раз, Вы были бы вынуждены всегда выполнить локальные сценарии относительно CWD с полными путями для знания то, что Вы выполняете:

"$(pwd)/someprog"

, который был бы чрезвычайно раздражающим также.

Другое правило, что Вы могли бы испытать желание придумать, будет:

относительные пути используют только ПУТЬ, полные пути только CWD

, но еще раз это вынуждает пользователей всегда использовать полные пути для сценариев непути с [1 116].

/ правило поиска пути предлагает простое для запоминания решения о проблеме:

  • наклонная черта: не используйте PATH
  • никакая наклонная черта: только используйте PATH

, который делает супер легким всегда знать то, что Вы выполняете путем доверия тому, что файлы в текущем каталоге могут быть выражены или как [1 120] или somefile, и таким образом, это дает особое значение одному из них.

Иногда, является немного раздражающим, который Вы не можете искать some/prog относительно [1 123], но я не вижу более нормальное решение этого.

0
ответ дан 23 November 2019 в 02:16
поделиться