34

Когда исполняется файл, как Unix ищет его? Если в PATH есть несколько исполняемых файлов с одним и тем же именем, какой из них предпочтительнее? Текущий каталог включается в поиск при выполнении файла?

Предположим, что в текущем каталоге есть файл с именем executable.sh . Будет ли это работать, если он выполняется $ executed и . не является частью PATH?

5 ответов5

34

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

16

Для файлов в текущем каталоге вам нужно поставить перед ними ./ , поэтому команда станет ./executable.sh . Вы никогда не должны иметь . в вашем PATH, поскольку это представляет угрозу безопасности, среди других проблем.

Каталоги, которые идут первыми в PATH и ищутся первыми.

Общий порядок поиска такой, если я правильно помню:

  • псевдонимы

  • экспортируемые функции

  • встроенные команды оболочки

  • скрипты и двоичные файлы в вашем PATH

6

Хотя некоторые другие хорошо ответили на этот вопрос, я хотел бы добавить несколько мыслей:

1) PATH используется только в том случае, если в вызываемом исполняемом файле нет элементов пути. somecommand будет искать в $ PATH, ./somecommand или /usr/bin/somecommand , или ../../bin/somecommand просто используйте правила каталога, а не PATH

Если в PATH есть несколько исполняемых файлов с одинаковыми именами, какой из них предпочтительнее?

Он останавливается на первом найденном, читая $ PATH слева направо.

Текущий каталог включается в поиск при запуске файла?

Если текущий каталог находится в PATH, то он ищется. Помните, что пустой каталог в PATH включает текущий каталог. например, PATH =:/usr/bin (ведущий пустой) PATH =/usr/bin: (завершающий пустой) и PATH =/usr/bin::/bin (средний пустой) будут эффективно включать текущий рабочий каталог.

Предположим, что в текущем каталоге есть файл с именем executetable.sh. Будет ли это работать, если он выполняется $ выполняется и. не является частью PATH?

Он никогда не найдет его путем поиска PATH. Если текущий каталог не находится в PATH, он не найдет его при поиске PATH.

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

3

Чтобы увидеть, какой путь вы используете в данный момент, просто введите echo $PATH или printenv PATH .

Тогда вы будете знать порядок поиска. Если у вас есть несколько файлов с одним и тем же именем, просто запустите ____, чтобы увидеть.

Ex.

система #> какой grep

/ USR / бен / Grep

классный способ найти файлы, которые работают так, как вы хотите, - это использовать:

по поводу grep

bzgrep (1) - ищет, возможно, bzip2 сжатые файлы для регулярного выражения

egrep (1) - печатать строки, соответствующие шаблону

fgrep (1) - печатать строки, соответствующие шаблону

grep (1) - печатать строки, соответствующие шаблону

и так далее...

-2

@ coneslayer - Порядок поиска исполняемого файла по умолчанию - текущий путь, встроенные команды и затем $ PATH. Таким образом, если функция с именем исполняемый файл уже существует в pwd, то она выполняется. Если нет, то приоритет выполняет поиск встроенных команд оболочки, а затем $ PATH.

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