Если у меня есть программа с именем foo, почему мне нужно писать ./foo, а не просто foo? Разве ./ не означает только текущий каталог?
решение1
Когда вы вводите только команду, например, foo
оболочка (обычно bash
) будет искать ее только в определенных каталогах, например /bin, /usr/bin, /usr/X11R6/bin и т. д. Обычно она будетнетпосмотрите в вашем "текущем каталоге" (т. е. "." ) из соображений безопасности (особенноесли выкорень). Если добавлено "." его следует добавить кконецпуть поиска.
Если вы хотите запустить исполняемый файл, которыйнетВ этом search-path нужно указать полный абсолютный или относительный путь к команде. Например:
/home/bok/foo # Absolute in my homedir
~/src/bar # Shorthand for my homedir and a subdir in it
../Download/foobar # Relative path – up one step, then down in Download
Или — если команда находится в моем текущем каталоге — просто добавьте ./
:
./foo
Путь поиска bash
хранится вПУТЬпеременная-окружающей среды, поэтому вы можете увидеть ее, введя:
echo $PATH
Чтобы добавить "." – что вы действительноне следуетсделать – введите:
export PATH="$PATH:."
Поиск в PATH выполняется по порядку, поэтому, если в разных каталогах находится несколько исполняемых файлов с одинаковым именем, оболочка выполнит тот, который находится в каталоге, указанном первым в PATH.
Сначала, просмотрев все перечисленные каталоги, вы получите ошибку «команда не найдена»?
+++
Проблема с добавлением текущего каталога – .
– в PATH заключается в том, что вы на самом деле не знаете, следует ли запускать исполняемый файл в «нестандартном» каталоге, в котором вы, возможно, случайно оказались, или нет.
Допустим, я злой и создаю разрушительную программу, которая удаляет как можно больше файлов и оставляет их в моем домашнем каталоге — или, что еще хуже, в /tmp... Я называю эту программу sl
— обычным промахом ls
— и жду.
Какой-то случайный пользователь находится в /tmp и неправильно пишет ls
. sl
С обычным PATH – без . – ничего не происходит, кроме того, что он получает ошибку «команда не найдена». Если в конце PATH у него есть '.', то он не получит ошибку при вводе команды. Вместо этого sl
запустится моя команда и удалит все файлы, которыми он владеет. Если он окажетсякорень, команда сможет удалить большую часть системы. (Вот почемукорень действительно долженвозьмите за правиловсегдаиспользоватьполный путькоманд, а не доверять PATH.)
Если бы он поместил «.» первым в своем PATH, а я бы создал программу с именем ls
(правильное написание) и поместил ее в каталог, то это было бымойпрограмма – не обычная ls
– которая будет запущена, если он введет ls
в этот каталог. Потому что bash
будет искать в текущем каталоге (.)первый– прежде чем искать в системных каталогах подлинные ls
.