При каких обстоятельствах исполняемый файл, впервые найденный в пути, не будет использоваться

15

У меня странное поведение с zsh (5.4.2_1, установленным с homebrew) на osx, не использующим первое вхождение исполняемого файла в пути.

Вот сценарий:

echo $PATH возвращает:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

варево в обоих

/usr/local/Cellar/zplug/HEAD-9fdb388/bin     

и

usr/local/bin/brew

Это подтверждается запуском которого -a brew, который возвращает:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew   
/usr/local/bin/brew

Но когда я запускаю, который варит это возвращает:

/usr/local/bin/brew

и варево бежит, /usr/local/bin/brewа не/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Как это может произойти, когда варево находится на пути раньше?

Помощь оценена.

континуум
источник
7
rehashи запустите их снова - если это все еще случится потом, отредактируйте это.
Майкл Гомер
@MichaelHomer: Да это один. Опыт здесь.
Джошуа

Ответы:

25

which -a cmdищет все обычные файлы, имена cmdкоторых у вас есть разрешение на выполнение в каталогах $path(в дополнение к псевдонимам, функциям, встроенным ...).

В то время как which cmdвозвращает команду, которая zshбудет выполняться ( whichвстроена zshкак вtcsh но в отличие от большинства других оболочек).

zshКак и большинство других оболочек, запоминает пути исполняемых файлов в hashтаблице, чтобы не приходилось искать их во всех каталогах в$path каждом их вызове.

С этой хеш-таблицей (представленной в $commandsассоциативном массиве zsh) можно манипулироватьhash командой (стандартная команда оболочки POSIX).

Если вы выполнили brewкоманду (или which/type/whence brewиспользовали завершение команды или что-то, что заполнило бы этот хэш / кэш) до того, как она была добавлена /usr/local/Cellar/zplug/HEAD-9fdb388/binили /usr/local/Cellar/zplug/HEAD-9fdb388/binбыла добавлена $path, zshто запомнила бы ее путь и сохранила как$commands[brew]=/usr/local/bin/brew .

В этом случае вы можете использовать hash -r(как в оболочке Bourne) или rehash(как в csh) zsh забыть запомненные команды (аннулировать этот кеш ), чтобы он мог найти его в следующий раз и найти его в новом месте.

Стефан Шазелас
источник
Спасибо - это решило проблему. Должен ли я быть в состоянии повторить $ command [brew] - я ничего не вижу?
континуум
1
@continuum, прости, мой плохой, это $commandsне так $command. Смотрите редактировать.
Стефан
0

/usr/local/bin/brew обычно является символической ссылкой.

Так /usr/local/bin/brewи /usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

наверное одни и те же файлы.

тип:

ls -al /usr/local/bin/brew

подтвердить.

Майкл - млк
источник