Почему при выполнении программы используется «./»?

Почему при выполнении программы используется «./»?

Если у меня есть программа с именем 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.

Связанный контент