Es probable que tenga un conjunto de RUTA largo y, para encontrar un ejecutable, el shell necesita buscar la ruta. Para evitar ese proceso lento cada vez que desea ejecutar un programa, el shell puede mantener una lista de programas que ya ha encontrado. Esa lista se llama "hash". Cuando el shell dice que which
está en hash, significa que ya ha realizado la búsqueda de RUTA y ha encontrado which
y guardado su ubicación en el hash.
man bash
lo explica de la siguiente manera:
Bash usa una tabla hash para recordar los nombres completos de las rutas de los archivos ejecutables (vea el hash debajo de COMANDOS SHELL BUILTIN a continuación). Se realiza una búsqueda completa de los directorios en PATH solo si el comando no se encuentra en la tabla hash.
Si bien el hash normalmente acelera las operaciones de shell, hay un caso en el que causa problemas. Si actualiza su sistema y, como resultado, algunos ejecutables se mueven a una nueva ubicación, el shell puede confundirse. La solución es ejecutar, lo hash -r
que hace que el shell olvide todas las ubicaciones hash y busque la RUTA desde cero.
¿Por qué faltan algunos ejecutables del hash?
Un ejecutable no se coloca en el hash hasta después de ejecutarlo al menos una vez. Observar:
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)
python
se procesa solo después de que se haya ejecutado.
Cómo examinar lo que hay en el hash de bash
El contenido del hash está disponible en la bash
matriz BASH_CMDS
. Puedes ver lo que contiene con el comando declare -p BASH_CMDS
. Cuando se abre un nuevo shell o subshell, el hash está vacío. Los comandos se agregan uno por uno a medida que se usan. Desde un caparazón recién abierto, observe:
$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'
which
y no parapython
?