В 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
.