Как Unix ищет исполняемые файлы?

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

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

47
задан 05.03.2017, 13:36

4 ответа

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

45
ответ дан 07.12.2019, 08:33

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

Каталоги, которые на первом месте в ПУТИ и искавший сначала.

Полный порядок на поиск похож на это, если я помню правильно:

  • псевдонимы

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

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

  • сценарии и двоичные файлы в Вашем ПУТИ

19
ответ дан 07.12.2019, 08:33

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

1) С ПУТЕМ только консультируются, если вызванный исполняемый файл не имеет никаких элементов пути в нем. somecommand искался бы в $PATH, ./somecommand или /usr/bin/somecommand, или ../../bin/somecommand просто используйте правила каталога, не СОЕДИНИТЕ КАНАЛОМ

Если существует несколько исполняемых файлов в ПУТИ с тем же именем, какой предпочтен?

Это останавливается в первом, которое это находит, читая $PATH слева направо.

Текущий каталог включен в поиск, когда файл выполняется?

Если текущий каталог находится в ПУТИ затем, он ищется. Помните, что пустой каталог в ПУТИ включает текущий каталог. например, Путь =:/usr/bin (ведущий пустой) СОЕДИНЯЕТ =/usr/bin каналом: (запаздывание пустого), и ПУТЬ =/usr/bin::/bin (пустая середина) будет все эффективно включать текущий рабочий каталог.

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

Это никогда не находило бы его путем поиска ПУТИ. Если текущий dir не будет в ПУТИ, то он не найдет его поиском ПУТИ.

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

8
ответ дан 07.12.2019, 08:33

Видеть то, что Ваш путь в настоящее время является просто типом echo $PATH, или printenv PATH.

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

Напр.

system#>, который grep

/usr/bin/grep

прохладный способ найти файлы, которые работают как Ваша цель, состоит в том, чтобы использовать кстати:

кстати grep

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

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

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

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

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

4
ответ дан 07.12.2019, 08:33

Теги

Похожие вопросы