W jakich okolicznościach plik wykonywalny znaleziony po raz pierwszy na ścieżce nie zostanie użyty

15

Mam dziwne zachowanie z zsh (5.4.2_1 zainstalowany z homebrew) na OSX, który nie używa pierwszego wystąpienia pliku wykonywalnego na ścieżce.

Oto scenariusz:

echo $PATH zwroty:

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

napar jest w obu

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

i

usr/local/bin/brew

Jest to potwierdzane przez uruchomienie, który - napar, który zwraca:

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

Ale kiedy uruchamiam, który napar wraca:

/usr/local/bin/brew

a napar/usr/local/bin/brew raczej działa/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Jak to się może stać, gdy napar jest wcześniej na ścieżce?

Pomoc doceniona.

kontinuum
źródło
7
rehashi uruchom je ponownie - jeśli nadal tak się dzieje, edytuj to w.
Michael Homer,
@MichaelHomer: Tak, to jest to. Doświadcz tutaj.
Joshua,

Odpowiedzi:

25

which -a cmdszuka wszystkich zwykłych plików, cmdktórych nazwy masz uprawnienia do wykonywania w katalogach w $path(oprócz aliasów, funkcji, wbudowanych ...).

Podczas gdy which cmdzwraca polecenie, które zshby się uruchomiło ( whichjest wbudowane zshjak w, tcshale w przeciwieństwie do większości innych powłok).

zsh, podobnie jak większość innych powłok, pamięta ścieżki plików wykonywalnych w hashtabeli, aby nie trzeba było ich przeglądać we wszystkich katalogach przy $pathkażdym ich wywołaniu.

Tą tabelą skrótów (widoczną w $commandstablicy asocjacyjnej w zsh) można manipulować za pomocą hashpolecenia (standardowe polecenie powłoki POSIX).

Jeśli uruchomiłeś brewpolecenie (lub which/type/whence brewużywałeś polecenia uzupełniającego lub cokolwiek, co przygotowałoby ten skrót / pamięć podręczną) przed dodaniem go /usr/local/Cellar/zplug/HEAD-9fdb388/binlub /usr/local/Cellar/zplug/HEAD-9fdb388/bindodaniem do niego $path, zshzapamiętałbyś jego ścieżkę i zapisał jako $commands[brew]=/usr/local/bin/brew.

W takim przypadku możesz użyć hash -r(jak w powłoce Bourne'a) lub rehash(jak w csh), aby zsh zapomnieć zapamiętane polecenia (unieważnić pamięć podręczną ), aby następnym razem mogła je wyszukać i znaleźć w nowej lokalizacji.

Stéphane Chazelas
źródło
Dzięki - rozwiązało to problem. Czy powinienem być w stanie powtórzyć polecenie $ [napar] - nic nie widzę?
Continuum
1
@continuum, przepraszam, mój zły, to $commandsnie jest $command. Zobacz edycję.
Stéphane Chazelas,
0

/usr/local/bin/brew jest zwykle dowiązaniem symbolicznym.

Więc /usr/local/bin/brewi /usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

to prawdopodobnie te same pliki.

rodzaj:

ls -al /usr/local/bin/brew

potwierdzać.

michael - mlc
źródło