В bash (или в любой другой оболочке), когда вы вводите "firefox" или другую команду, как bash указывает его фактическое местоположение (/usr/bin/firefox)? Кроме того, где находится "каталог" для автозаполнения Bash?
4 ответа
bash и другие оболочки и командные процессоры ищут в ваших каталогах PATH, ища исполняемый файл, который соответствует введенному вами имени команды.
Существует $PATH которая содержит все пути (разделенные двоеточиями) для поиска имен команд. Эти папки проверяются от первой до последней, и команда выполняется при их обнаружении (поэтому, если в разных каталогах $PATH несколько файлов с таким именем, будет выполнен первый).
Для просмотра $PATH:
echo $PATH
Чтобы проверить, где находится firefox :
which firefox
Основы уже приведены в других ответах. Технически оболочка хранит расположение команды в хеш-таблице. В bash вы можете просмотреть эту таблицу с помощью команды hash:
$ hash
hits command
2 /usr/bin/ldd
1 /usr/bin/man
1 /usr/bin/less
Вы также можете изменить эту хеш-таблицу, для подробностей я цитирую справочную страницу bash :
hash [-lr] [-p filename] [-dt] [name]Для каждого имени полное имя файла команды определяется путем поиска в каталогах в $ PATH и запоминается. Если указана опция -p, поиск пути не выполняется, а имя файла используется в качестве полного имени файла команды. Опция -r заставляет оболочку забыть все запомненные места. Опция -d заставляет оболочку забыть запоминаемое расположение каждого имени. Если указана опция -t, печатается полный путь, которому соответствует каждое имя. Если несколько аргументов имени поставляются с -t, имя печатается перед хэшированным полным путем. Опция -l заставляет вывод отображаться в формате, который может быть повторно использован как ввод. Если аргументы не указаны или указан только -l, выводится информация о запомненных командах. Статус возврата - true, если имя не найдено или указан неверный параметр. Здесь вы можете увидеть, какие команды вы уже выполнили в этом сеансе.
Другие оболочки могут вести себя по-другому, в zsh (и я думаю, что это было адаптировано из csh) оболочка собирает все команды при запуске или с помощью rehash . Затем вы получите полный список всех доступных команд с hash и сможете искать, например, все варианты diff:
zsh$ hash | grep diff
bzdiff=/usr/bin/bzdiff
cdiff=/usr/bin/cdiff
colordiff=/usr/bin/colordiff
diff=/usr/bin/diff
diff3=/usr/bin/diff3
ptardiff=/usr/bin/ptardiff
sdiff=/usr/bin/sdiff
tkdiff=/usr/bin/tkdiff
vimdiff=/usr/bin/vimdiff
xzdiff=/usr/bin/xzdiff
zdiff=/usr/bin/zdiff
Опять же, проконсультируйтесь с man zshbuiltins для более подробной информации.
- bash использует переменную среды
$PATHдля поиска программ по словам. Пути разделены:Ваш$PATH, скорее всего, выглядит примерно так:/usr/bin:/usr/games:/usr/local/bin:/usr/local/games:поэтому он находит его в/usr/local/bin. Измените ваш$PATHи попробуйте снова. - Вы можете изменить поведение автодополнения с помощью
completeвстроенной команды. Смотрите "Программируемое завершение"man bash.
