1

В bash (или в любой другой оболочке), когда вы вводите "firefox" или другую команду, как bash указывает его фактическое местоположение (/usr/bin/firefox)? Кроме того, где находится "каталог" для автозаполнения Bash?

4 ответа4

1

bash и другие оболочки и командные процессоры ищут в ваших каталогах PATH, ища исполняемый файл, который соответствует введенному вами имени команды.

1

Существует $PATH которая содержит все пути (разделенные двоеточиями) для поиска имен команд. Эти папки проверяются от первой до последней, и команда выполняется при их обнаружении (поэтому, если в разных каталогах $PATH несколько файлов с таким именем, будет выполнен первый).

Для просмотра $PATH:

echo $PATH

Чтобы проверить, где находится firefox :

which firefox
1

Основы уже приведены в других ответах. Технически оболочка хранит расположение команды в хеш-таблице. В 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 для более подробной информации.

0
  1. bash использует переменную среды $PATH для поиска программ по словам. Пути разделены : Ваш $PATH , скорее всего, выглядит примерно так :/usr/bin:/usr/games:/usr/local/bin:/usr/local/games: поэтому он находит его в /usr/local/bin . Измените ваш $PATH и попробуйте снова.
  2. Вы можете изменить поведение автодополнения с помощью complete встроенной команды. Смотрите "Программируемое завершение" man bash .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .