hashes un comando incorporado bash. La tabla hash es una característica bash que evita que tenga que buscar $PATHcada vez que escribe un comando almacenando en caché los resultados en la memoria. La tabla se borra en eventos que obviamente invalidan los resultados (como modificar $PATH)
El hashcomando es solo cómo interactúa con ese sistema (por cualquier razón que sienta que necesita).
Algunos casos de uso:
Como viste, imprime cuántas veces tocas qué comandos si lo escribes sin argumentos. Esto podría decirle qué comandos usa con más frecuencia.
También puede usarlo para recordar ejecutables en ubicaciones no estándar.
Ejemplo:
[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you're thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#
Lo que podría ser útil si solo tiene un único ejecutable en un directorio fuera del $PATHque desea ejecutar simplemente escriba el nombre en lugar de incluir todo en ese directorio (lo que sería el efecto si lo agregara $PATH).
Sin embargo, un alias generalmente también puede hacer esto, y dado que está modificando el comportamiento del shell actual, no está mapeado en los programas que inicia. Un enlace simbólico al ejecutable solitario es probablemente la opción preferible aquí. hashEs una forma de hacerlo.
- Puede usarlo para no recordar rutas de archivos. Esto es útil si un nuevo ejecutable aparece en un
PATHdirectorio anterior o llega mva otro lugar y desea forzar a bash a salir y encontrarlo nuevamente en lugar del último lugar donde recuerda haberlo encontrado.
Ejemplo:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif newDIT.ldif notes.txt users.ldif
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /lol-wut/ls
[root@policyServer ~]#
El cpcomando provocó que una nueva versión del lsejecutable apareciera antes en mi $PATHpero no activó una purga de la tabla hash. Solía hash -dpurgar selectivamente la entrada lsde la tabla hash. Bash se vio obligado a mirar de $PATHnuevo y, cuando lo hizo, lo encontró en la ubicación más nueva (antes en $ PATH que antes).
Sin $PATHembargo, puede invocar selectivamente este comportamiento "buscar nueva ubicación del ejecutable desde ":
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
En su mayoría, solo querría hacer esto si deseaba algo fuera de la tabla hash y no era 100% posible que pudiera cerrar sesión y luego volver a ingresar con éxito, o si desea conservar algunas modificaciones que ha realizado en su shell.
Para deshacerse de las asignaciones obsoletas, también puede hacer hash -r(o export PATH=$PATH) lo que efectivamente purga toda la tabla hash de bash.
Hay muchas pequeñas situaciones como esa. No sé si lo llamaría uno de los comandos "más útiles", pero tiene algunos casos de uso.
hashcomando usa internamente una tabla hash para almacenar las asignaciones. es.wikipedia.org/wiki/Hash_tablehashno esbashespecífico, el comando se originó en el shell Bourne en SVR2 (aunque la característica de rutas de hashing de comandos proviene decsheso antes) y se encuentra en todos los shells similares a Bourne y POSIX.export PATH=$PATHlimpiar la mesa,hash -rdebería ser suficiente.hash -ro obtendrá la versión anterior porque $ PATH no cambió y, por lo tanto, Bash no se da cuenta de que podría cargar el mismo programa desde un directorio anterior (de mayor prioridad). Ver conda.pydata.org/docs/… para más detalles.Aquí está el uso clásico, simplificado:
fuente
hash hello.setopt -s checkhashy el ejecutable hash para un comando ya no existe, la entrada hash para ese comando se actualizará. Pero tenga en cuenta que cada sesión bash tenía su propia tabla hash, por lo que cerrar la sesión y comenzar una nueva efectivamente vacía el hash. (hash -res una manera más fácil de hacer eso).$PATHo iniciar un nuevo terminal de bash, ambos parecen limpiar la tabla.Aquí hay un uso útil de
hash:Significa: si php no está en la RUTA, entonces use
fuente
Sí, el Manual de referencia de Bash dice:
Pero puede deshabilitar el hash con
set +h:Tratar:
Lo mismo es para
hash -r,hash NAMEetc.Una "detección de comando" (como esto o aquello ) no funciona:
Puedes escribir algo como esto:
o (gracias a @mikeserv) sin tener que asignar ninguna variable nueva ni hacer ninguna prueba:
fuente
old_optionscosa, generalmente hago algo como esto:set -h -- "-${-:--}" "$@"; hash ...; set +h "$@"por lo que todo encaja automáticamente sin tener que asignar ninguna variable nueva o hacer ninguna prueba o lo que sea.Detección fácil si un comando está disponible:
fuente