Deshabilitar la caché de bash de ejecutables en la ruta

12

Tenga en cuenta que esto no es un duplicado. Estoy preguntando sobre deshabilitar el caché, no borrarlo. Si tiene que borrar un caché, obviamente no está deshabilitado.

En las raras ocasiones en que noto la memoria caché de bash de cosas que ha encontrado en el camino, no es porque sea útil, es porque es muy molesto. Un ejemplo:

~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory

En otro caparazón ...

~ dc$ which which
/usr/bin/which

Estoy seguro de que este almacenamiento en caché tenía sentido en los viejos tiempos, cuando los discos eran lentos y la memoria era costosa y limitada, por lo que no podía almacenar mucho en caché: el almacenamiento en caché de una ruta es más barato que el almacenamiento en caché de todos los bloques de disco necesarios para encontrar un comando . Pero en estos días no proporciona ningún beneficio notable y causa más problemas de los que resuelve. Es un error, rayando en ser un error.

Y ni siquiera puedo encontrar una manera de desactivarlo. Cualquier puntero?

DrHyde
fuente
1
Los beneficios son notables incluso en el caso común de una máquina de escritorio, si no tiene tanta RAM que /usr/binqueda completamente en caché.
Gilles 'SO- deja de ser malvado'
1
@drhyde, lo siento. Marqué esta pregunta como duplicada. Se usa set +hpara deshabilitar el hashing.
Evgeny Vereshchagin
En Nixos, deshabilitó el hash en su bash. Creo que, por una buena razón, por la forma de trabajar de Nixos. Sin embargo, no estoy seguro de si esto es realmente obligatorio para Nixos. Solo digo que un hash en bash puede traer problemas en ciertas situaciones.
typelogic

Respuestas:

12

Puede borrar los ejecutables hash antes de que se dibuje el mensaje:

PROMPT_COMMAND='hash -r'

De help hash:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d                forget the remembered location of each NAME
  -l                display in a format that may be reused as input
  -p pathname       use PATHNAME is the full pathname of NAME
  -r                forget all remembered locations
  -t                print the remembered location of each NAME, preceding
            each location with the corresponding NAME if multiple
            NAMEs are given
Arguments:
  NAME              Each NAME is searched for in $PATH and added to the list
            of remembered commands.

Exit Status:
Returns success unless NAME is not found or an invalid option is given.
Chris Down
fuente
1
ver mi respuesta sobreset +h
Evgeny Vereshchagin
1
@EvgenyVereshchagin set +hno es ideal, ya que muchas utilidades (por ejemplo, instalaciones de gemas de rubí) llaman hash, produciendo flujos de -bash: hash: hashing disabledadvertencias.
David Moles
También veo los mismos mensajes de advertencia en una activación de python virtualenv. Pero creo que es inofensivo.
typelogic
8

Puede forzar a bash a hacer una nueva búsqueda de ruta en caso de que un comando en la tabla hash ya no exista.

shopt -s checkhash

De la página de manual de bash:

checkhash

    Si está configurado, bash verifica que exista un comando encontrado en la tabla hash antes de intentar ejecutarlo. Si ya no existe un comando hash, se realiza una búsqueda de ruta normal.

Ejemplo:

[blabla]$ PATH=$HOME/bin:$PATH
[blabla]$ hash -r
[blabla]$ cat bin/which
#!/bin/bash
echo "my which"
[blabla]$
[blabla]$ shopt -s checkhash
[blabla]$ which
my which
[blabla]$ mv bin/which bin/dis.which
[blabla]$ which which
/usr/bin/which
usuario70408
fuente