In quali circostanze l'eseguibile trovato per primo nel percorso non verrà utilizzato


15

Sto riscontrando un comportamento strano con zsh (5.4.2_1 installato con homebrew) su osx che non utilizza la prima occorrenza di un eseguibile nel percorso.

Ecco lo scenario:

echo $PATH ritorna:

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

la birra è in entrambi

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

e

usr/local/bin/brew

Ciò è confermato eseguendo quale -una birra che restituisce:

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

Ma quando corro quale birra ritorna:

/usr/local/bin/brew

e la birra funziona /usr/local/bin/brewpiuttosto che/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Come può accadere quando la birra è all'inizio del percorso?

Aiuto apprezzato.


7
rehashed esegui di nuovo quelli - se succede ancora dopo, modificalo in.
Michael Homer il

@MichaelHomer: Sì, è quello. Esperienza qui.
Giosuè,

Risposte:


25

which -a cmdcerca tutti i file regolari nominati per i cmdquali hai i permessi di esecuzione nelle directory $path(oltre ad alias, funzioni, builtin ...).

While which cmdrestituisce il comando che zshverrebbe eseguito ( whichè incorporato in zshlike in tcshma a differenza della maggior parte delle altre shell).

zsh, come la maggior parte delle altre shell ricorda i percorsi degli eseguibili in una hashtabella in modo da non doverli cercare in tutte le directory $pathogni volta che li invochi.

Quella tabella hash (esposta nella $commandsmatrice associativa in zsh) può essere manipolata con il hashcomando (comando shell POSIX standard).

Se hai eseguito il brewcomando (o which/type/whence brew, o hai utilizzato il completamento del comando o qualcosa che avrebbe innescato quell'hash / cache) prima che fosse aggiunto /usr/local/Cellar/zplug/HEAD-9fdb388/bino prima che /usr/local/Cellar/zplug/HEAD-9fdb388/binfosse aggiunto $path, zshavrebbe ricordato il suo percorso e archiviato come $commands[brew]=/usr/local/bin/brew.

In tal caso, puoi usare hash -r(come nella shell Bourne) o rehash(come in csh) per zsh dimenticare i comandi ricordati (invalidare quella cache ), in modo che possa cercarla la prossima volta e trovarla nella nuova posizione.


Grazie - questo ha risolto il problema. Dovrei essere in grado di echo $ command [brew] - Non vedo nulla?
continuum

1
@continuum, scusa, mio ​​male $commands, no $command. Vedi modifica.
Stéphane Chazelas,

0

/usr/local/bin/brew è di solito un collegamento simbolico.

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

sono probabilmente gli stessi file.

genere:

ls -al /usr/local/bin/brew

per confermare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.