hash
es un comando incorporado bash. La tabla hash es una característica bash
que evita que tenga que buscar $PATH
cada 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 hash
comando 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 $PATH
que 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í. hash
Es una forma de hacerlo.
- Puede usarlo para no recordar rutas de archivos. Esto es útil si un nuevo ejecutable aparece en un
PATH
directorio anterior o llega mv
a 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 cp
comando provocó que una nueva versión del ls
ejecutable apareciera antes en mi $PATH
pero no activó una purga de la tabla hash. Solía hash -d
purgar selectivamente la entrada ls
de la tabla hash. Bash se vio obligado a mirar de $PATH
nuevo y, cuando lo hizo, lo encontró en la ubicación más nueva (antes en $ PATH que antes).
Sin $PATH
embargo, 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.
hash
comando usa internamente una tabla hash para almacenar las asignaciones. es.wikipedia.org/wiki/Hash_tablehash
no esbash
específico, el comando se originó en el shell Bourne en SVR2 (aunque la característica de rutas de hashing de comandos proviene decsh
eso antes) y se encuentra en todos los shells similares a Bourne y POSIX.export PATH=$PATH
limpiar la mesa,hash -r
debería ser suficiente.hash -r
o 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 checkhash
y 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 -r
es una manera más fácil de hacer eso).$PATH
o 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 NAME
etc.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_options
cosa, 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