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/brew
lugar 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.
rehash
y ejecutarlos de nuevo, si aún sucede después, edítelo .Respuestas:
which -a cmd
busca todos los archivos normales nombrados para loscmd
cuales tiene permiso de ejecución en los directorios$path
(además de alias, funciones, incorporados ...).While
which cmd
devuelve el comando quezsh
se ejecutaría (which
es una función incorporadazsh
similartcsh
a 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 unahash
tabla para no tener que buscarlos en todos los directorios$path
cada vez que los invoca.Esa tabla hash (expuesta en la
$commands
matriz asociativa enzsh
) se puede manipular con elhash
comando (comando de shell POSIX estándar).Si ha ejecutado el
brew
comando (owhich/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/bin
o antes de/usr/local/Cellar/zplug/HEAD-9fdb388/bin
agregarlo$path
,zsh
habrí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) orehash
(como en csh) parazsh
olvidar los comandos recordados (invalidar ese caché ), para que pueda buscarlo la próxima vez y encontrarlo en la nueva ubicación.fuente
$commands
no$command
. Ver editar./usr/local/bin/brew
es generalmente un enlace simbólico.Entonces
/usr/local/bin/brew
y/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew
son probablemente los mismos archivos.
tipo:
para confirmar.
fuente