За яких обставин виконуваний файл вперше знайдений у шляху не буде використаний


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

Це підтверджується запуском якого-варить, який повертає:

/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 [варити] - я нічого не бачу?
континуум

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

підтвердити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.