¿En qué circunstancias no se utilizará el ejecutable encontrado por primera vez en la ruta?


15

Tengo un comportamiento extraño con zsh (5.4.2_1 instalado con homebrew) en osx que no usa la primera aparición de un ejecutable en la ruta.

Aquí está el escenario:

echo $PATH devoluciones:

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

la cerveza está en ambos

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

y

usr/local/bin/brew

Esto se confirma ejecutando which -a brew que devuelve:

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

Pero cuando ejecuto cuál cerveza vuelve:

/usr/local/bin/brew

y la cerveza corre en /usr/local/bin/brewlugar de/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

¿Cómo puede suceder esto cuando la cerveza está más temprano en el camino?

Ayuda apreciada.


77
rehashy ejecutarlos de nuevo, si aún sucede después, edítelo .
Michael Homer

@MichaelHomer: Sí, ese es el. Experiencia aquí.
Joshua

Respuestas:


25

which -a cmdbusca todos los archivos normales nombrados para los cmdcuales tiene permiso de ejecución en los directorios $path(además de alias, funciones, incorporados ...).

While which cmddevuelve el comando que zshse ejecutaría ( whiches una función incorporada zshsimilar tcsha la de la mayoría de los otros shells).

zsh, como la mayoría de los otros shells, recuerda las rutas de los ejecutables en una hashtabla para no tener que buscarlos en todos los directorios $pathcada vez que los invoca.

Esa tabla hash (expuesta en la $commandsmatriz asociativa en zsh) se puede manipular con el hashcomando (comando de shell POSIX estándar).

Si ha ejecutado el brewcomando (o which/type/whence brew, o ha utilizado la finalización del comando o cualquier cosa que hubiera preparado ese hash / caché) antes de agregarlo /usr/local/Cellar/zplug/HEAD-9fdb388/bino antes de /usr/local/Cellar/zplug/HEAD-9fdb388/binagregarlo $path, zshhabría recordado su ruta y lo habría almacenado como $commands[brew]=/usr/local/bin/brew.

En ese caso, puede usar hash -r(como en el shell Bourne) o rehash(como en csh) para zsh olvidar los comandos recordados (invalidar ese caché ), para que pueda buscarlo la próxima vez y encontrarlo en la nueva ubicación.


Gracias, esto solucionó el problema. ¿Debería poder hacer eco del comando $ [brew] - No veo nada?
continuo

1
@continuum, lo siento, mi mal, eso $commandsno $command. Ver editar.
Stéphane Chazelas

0

/usr/local/bin/brew es generalmente un enlace simbólico.

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

son probablemente los mismos archivos.

tipo:

ls -al /usr/local/bin/brew

para confirmar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.