У меня странное поведение с 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
Как это может произойти, когда варево находится на пути раньше?
Помощь оценена.
rehash
и запустите их снова - если это все еще случится потом, отредактируйте это.Ответы:
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
забыть запомненные команды (аннулировать этот кеш ), чтобы он мог найти его в следующий раз и найти его в новом месте.источник
$commands
не так$command
. Смотрите редактировать./usr/local/bin/brew
обычно является символической ссылкой.Так
/usr/local/bin/brew
и/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew
наверное одни и те же файлы.
тип:
подтвердить.
источник