Когда вы вводите только команду - например. foo
- оболочка (обычно bash
) будет искать его только в определенных каталогах - например, / bin, / usr / bin, / usr / X11R6 / bin и так далее. Обычно не ищет в вашем «текущем каталоге» (т.е. «.») Из-за проблем безопасности ( особенно , если вы root ). Если "." добавлен, он должен быть добавлен к в конец пути поиска.
Если вы хотите запустить исполняемый файл, который не в этом пути поиска, вам необходимо указать полный абсолютный или относительный путь к команде. Например:
/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
хранится в ] PATH переменная среды, чтобы вы могли увидеть ее, набрав:
echo $PATH
Чтобы добавить "." - чего вы действительно не должны делать - введите:
export PATH="$PATH:."
ПУТЬ ищется по порядку, поэтому, если есть несколько исполняемых файлов с одинаковым именем в разных каталогах, это тот, который находится в каталоге первым в ПУТЬ, который будет выполнять оболочка.
Сначала после просмотра всех перечисленных каталогов вы получите ошибку «команда не найдена».
+++
Проблема с добавлением текущего каталога - .
- в PATH, заключается в том, что вы действительно не знаете, должен ли исполняться исполняемый файл в "нестандартном" каталоге, в котором вы случайно оказались, выполняться или нет.
Допустим, я злой и создаю деструктивную программу, которая удаляет как можно больше файлов и оставляет их в моем домашнем каталоге - или, что еще хуже, в / tmp ...Я называю эту программу sl
- распространенный тип ошибки ls
- и жду.
Какой-то случайный пользователь находится в / tmp и промахивается ls
с sl
. С обычным PATH - без. - ничего не происходит, кроме как «команда не найдена». Если он получил '.' в конце его PATH, тогда он не получит ошибки при вводе команды. Вместо этого моя команда sl
будет запущена и удалит все файлы, которыми он владеет. Если он окажется root , команда сможет удалить большую часть системы. (Вот почему root действительно должен сделать правило всегда использовать полный путь команд, а не доверять PATH.)
Если бы он поставил '.' сначала в его PATH, и я создал программу под названием ls
(правильное написание) и поместил ее в каталог, тогда это была бы моя программа, а не обычная ls
- это будет выполнено, если он наберет ls
в этом каталоге. Поскольку bash
будет искать в текущем каталоге (.) сначала - прежде чем искать в системных каталогах с подлинным ls
.