Когда исполняется файл, как Unix ищет его? Если в PATH есть несколько исполняемых файлов с одним и тем же именем, какой из них предпочтительнее? Текущий каталог включается в поиск при выполнении файла?
Предположим, executable.sh
в текущем каталоге есть файл с именем . Будет ли это работать, если оно выполняется $ executed
и .
не является частью PATH
?
which <executable>
команды будет полезно в этой теме.Ответы:
$ PATH ищется от начала до конца, при этом запускается первый соответствующий исполняемый файл. Таким образом, каталоги в начале $ PATH имеют приоритет над теми, которые появляются позже. Исполняемые файлы в текущем каталоге (.) Выполняются только если. находится в $ PATH (чего обычно нет ). Не существует неявного включения текущего каталога в путь поиска.
источник
.
, но, похоже, сначала будет искать из текущего каталога, прежде чем проверять каталоги, определенные в самом $ PATH.Для файлов в текущем каталоге вы захотите поставить перед ними
./
команду, чтобы команда стала./executable.sh
. Вы никогда не должны иметь.
в своем PATH, поскольку это представляет угрозу безопасности, среди других проблем.Каталоги, которые идут первыми в PATH и ищутся первыми.
Общий порядок для поиска, как это , если я правильно помню:
псевдонимы
экспортируемые функции
встроенные команды оболочки
скрипты и двоичные файлы в вашем PATH
источник
hash -r
), если вы меняете путь или местоположение программы.Хотя некоторые другие хорошо ответили на этот вопрос, я хотел бы добавить несколько мыслей:
1) PATH используется только в том случае, если в вызываемом исполняемом файле нет элементов пути. somecommand будет искать в $ PATH,
./somecommand
или/usr/bin/somecommand
, или../../bin/somecommand
просто использовать правила каталога, а не PATHОн останавливается на первом найденном, читая $ PATH слева направо.
Если текущий каталог находится в PATH, то он ищется. Помните, что пустой каталог в PATH включает текущий каталог. например, PATH =: / usr / bin (ведущий пустой) PATH = / usr / bin: (конечный пустой) и PATH = / usr / bin :: / bin (средний пустой) будут эффективно включать текущий рабочий каталог.
Он никогда не найдет его путем поиска PATH. Если текущий каталог не находится в PATH, он не найдет его при поиске PATH.
Это сказало (и извините, чтобы добавить путаницу), если был псевдоним или функция, которая выполнила команду, это будет выполнено. Или, если ваша оболочка имеет кэш местоположения, а исполняемый файл находится в кеше, он может его найти. Таким образом, он никогда не найдет его в PATH, но его можно запустить другими способами.
источник
cache
примечание, меня почти сводит с ума тот факт, что старый исполняемый файл in/usr/bin/
по-прежнему вызывается, а не новый/usr/local/bin
, однако он находится слева$PATH
до тех пор, пока я не выйду из системы и снова не выполню вход.Чтобы увидеть, какой путь вы используете в данный момент, просто введите
echo $PATH
илиprintenv PATH
.Тогда вы будете знать порядок поиска. Если у вас есть несколько файлов с одним и тем же именем, просто запустите ____, чтобы увидеть.
Ex.
классный способ найти файлы, которые работают так, как вы хотите, - это использовать:
и так далее...
источник
whereis
использует жестко закодированный список мест, а не$PATH
.@ coneslayer - порядок поиска исполняемого файла по умолчанию - текущий путь, встроенные команды, а затем $ PATH. Таким образом, если функция с именем исполняемый файл уже существует в pwd, то она выполняется. Если нет, то приоритет выполняет поиск встроенных команд оболочки, а затем $ PATH.
источник
./
), она будет искать только этот каталог; в противном случае он ищет$PATH
.