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

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

$ ./manage.py syncdb

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

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

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

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

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

(работает без ./)

Ответы [ 9 ]

286 голосов
/ 13 июня 2011

Поскольку в Unix обычно текущий каталог не находится в $PATH.

При вводе команды оболочка просматривает список каталогов, как указано в переменной PATH. Текущий каталог отсутствует в этом списке.

Причина отсутствия текущего каталога в этом списке - безопасность.

Допустим, вы являетесь пользователем root и зайдите в каталог другого пользователя и наберите sl вместо ls. Если текущий каталог находится в PATH, оболочка попытается выполнить программу sl в этом каталоге (поскольку другой программы sl нет). Эта sl программа может быть вредоносной.

Он работает с ./, поскольку POSIX указывает , что имя команды, содержащее /, будет использоваться непосредственно в качестве имени файла, подавляя поиск в $PATH. Вы могли бы использовать полный путь для того же эффекта, но ./ короче и проще для написания.

EDIT

Эта часть sl была просто примером. Каталоги в PATH ищутся последовательно, и при совпадении эта программа выполняется. Таким образом, в зависимости от того, как выглядит PATH, ввода обычной команды может быть, а может и не хватить для запуска программы в текущем каталоге.

48 голосов
/ 13 июня 2011

Когда bash интерпретирует командную строку, он ищет команды в местах, описанных в переменной среды $PATH. Чтобы увидеть это, наберите:

echo $PATH

У вас будет несколько путей, разделенных двоеточиями. Как вы увидите, текущий путь . обычно не в $PATH. Таким образом, Bash не может найти вашу команду, если она находится в текущем каталоге. Вы можете изменить его, набрав:

PATH=$PATH:.

Эта строка добавляет текущий каталог в $PATH, поэтому вы можете сделать:

manage.py syncdb

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

Избегайте:

PATH=.:$PATH

Как вы можете «замаскировать» какую-то стандартную команду и открыть дверь для нарушения безопасности :)

Только мои два цента.

40 голосов
/ 13 июня 2011

Ваш скрипт, когда он находится в вашем домашнем каталоге, не будет найден, когда оболочка ищет переменную окружения $PATH, чтобы найти ваш скрипт.

В ./ говорится 'ищите мой скрипт в текущем каталоге, а не во всех каталогах, указанных в $PATH'.

5 голосов
/ 13 июня 2011

Когда вы включаете «.»по сути, вы даете «полный путь» исполняемому скрипту bash, поэтому вашей оболочке не нужно проверять переменную PATH.Без '.'ваша оболочка будет искать переменную PATH (которую вы можете увидеть, выполнив echo $PATH, чтобы узнать, находится ли введенная вами команда в какой-либо из папок в вашем PATH. Если нет (как в случае с manage.py)он говорит, что не может найти файл. Считается плохой практикой включать текущий каталог в вашу переменную PATH, что достаточно хорошо объяснено здесь: http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html

2 голосов
/ 13 июня 2011

В * nix, в отличие от Windows, текущий каталог обычно отсутствует в переменной $PATH.Таким образом, текущий каталог не ищется при выполнении команд.Вам не нужно ./ для запуска приложений, потому что эти приложения в вашем $ PATH;скорее всего они в /bin или /usr/bin.

1 голос
/ 20 октября 2016

На этот вопрос уже есть несколько отличных ответов, но я хотел бы добавить, что если ваш исполняемый файл находится в переменной PATH, и вы получаете совершенно разные результаты при запуске

./executable

на те, которые вы получите, если вы запустите

executable

(допустим, вы сталкиваетесь с сообщениями об ошибках с одним, а не с другим), тогда проблема может заключаться в том, что у вас на компьютере есть две разные версии исполняемого файла: одна на пути, а другая нет. *

Проверьте это, запустив

который исполняемый файл

и

whereis executable

Это исправило мои проблемы ... У меня было три версии исполняемого файла, только одна из которых была правильно скомпилирована для среды.

0 голосов
/ 28 сентября 2018

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

Кроме того, (точка-косая черта) имела для меня смысл, когда у меня есть команда для дочерней папки tmp2 (/ tmp / tmp2) и она использует (двойная точка-косая черта).

ОБРАЗЕЦ:

[fifiip-172-31-17-12 tmp]$ ./StackO.sh

Hello Stack Overflow

[fifi@ip-172-31-17-12 tmp]$ /tmp/StackO.sh

Hello Stack Overflow

[fifi@ip-172-31-17-12 tmp]$ mkdir tmp2

[fifi@ip-172-31-17-12 tmp]$ cd tmp2/

[fifi@ip-172-31-17-12 tmp2]$ ../StackO.sh

Hello Stack Overflow
0 голосов
/ 16 февраля 2013

Существует разница между Current Directory и Working Directory, вы можете легко найти его на google. Вот почему ваш manage.py syncdb не выполняется должным образом.

Текущий каталог : Это каталог, из которого выполняется ваша оболочка или родительский процесс.

you are right "."  is for current directory.

В системе на основе UNIX, если ваш файл находится на /data/myfile.out, вы переходите к нему через имена компонентов, которые разделены forward slash "/", поэтому, если "." - ваш текущий каталог, то если вы хотите получить доступ в вашем случае) файл, который находится в вашем текущем каталоге, вы должны будете сказать ./myexecutableFile.o. Если бы ваш исполняемый файл находился в другой папке вашего текущего каталога, вы бы сделали что-то вроде этого ./myFiles/myexecutableFile.o. Надеюсь, вы получили то, что я пытаюсь объяснить.

0 голосов
/ 13 июня 2011

Когда скрипт не находится в пути, это необходимо сделать.Для получения дополнительной информации читайте http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...