hash
est une commande intégrée de bash. La table de hachage est une fonctionnalité bash
qui l’empêche de chercher $PATH
chaque fois que vous tapez une commande en mettant en cache les résultats en mémoire. La table est effacée lorsque des événements invalident manifestement les résultats (tels que la modification $PATH
)
La hash
commande est simplement la façon dont vous interagissez avec ce système (pour la raison qui vous semble nécessaire).
Quelques cas d'utilisation:
Comme vous l'avez vu, il affiche le nombre de fois où vous appuyez sur quelle commande si vous le tapez sans argument. Cela peut vous indiquer les commandes que vous utilisez le plus souvent.
Vous pouvez également l'utiliser pour mémoriser des exécutables dans des emplacements non standard.
Exemple:
[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 ~]#
Ce qui pourrait être utile si vous avez juste un seul exécutable dans un répertoire en dehors de $PATH
celui que vous voulez exécuter en tapant simplement le nom au lieu de tout inclure dans ce répertoire (ce qui serait l'effet si vous l'ajoutiez à $PATH
).
Cela dit, un alias peut généralement aussi le faire, et puisque vous modifiez le comportement du shell actuel, il n'est pas mappé dans les programmes que vous lancez. Un lien symbolique vers l'exécutable isolé est probablement l'option préférable ici. hash
est une façon de le faire.
- Vous pouvez l'utiliser pour ne pas mémoriser les chemins de fichiers. Ceci est utile si un nouvel exécutable apparaît dans un
PATH
répertoire précédent ou va mv
quelque part et que vous voulez forcer bash à sortir et à le retrouver au lieu du dernier endroit mémorisé.
Exemple:
[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 ~]#
La cp
commande a fait ls
apparaître une nouvelle version de l' exécutable plus tôt dans my, $PATH
mais n'a pas déclenché de purge de la table de hachage. J'avais l'habitude hash -d
de purger sélectivement l'entrée ls
de la table de hachage. Bash a ensuite été obligé de regarder à $PATH
nouveau et quand il l'a fait, il l'a trouvé à l'emplacement le plus récent (plus tôt dans $ PATH qu'il était en cours d'exécution auparavant).
Vous pouvez invoquer sélectivement ce $PATH
comportement "trouver le nouvel emplacement de l'exécutable ", cependant:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
Vous voudriez surtout faire cela si vous vouliez quelque chose en dehors de la table de hachage et que vous ne pouviez pas vous déconnecter à 100%, puis revenir avec succès, ou si vous vouliez conserver certaines modifications que vous avez apportées à votre shell.
Pour vous débarrasser des mappages obsolètes, vous pouvez également faire hash -r
(ou export PATH=$PATH
) simplement purger la table de hachage entière de bash.
Il y a beaucoup de petites situations comme celle-là. Je ne sais pas si je l'appellerais l'une des commandes "les plus utiles", mais elle a quelques cas d'utilisation.
hash
commande utilise en interne une table de hachage pour stocker les mappages. en.wikipedia.org/wiki/Hash_tablehash
n’est pasbash
spécifique, la commande a été créée dans le shell Bourne dans SVR2 (bien que la fonctionnalité de hachage des chemins de commandes vienne d’csh
avant) et qu’elle se retrouve dans tous les shells de type Bourne et POSIX.export PATH=$PATH
vider la table, celahash -r
devrait suffire.hash -r
ou vous obtiendrez l'ancienne version car $ PATH n'a pas changé et donc Bash ne se rend pas compte qu'il pourrait charger le même programme à partir d'un répertoire plus ancien (priorité plus élevée). Voir conda.pydata.org/docs/… pour plus de détails.Voici l'utilisation classique, simplifiée:
la source
hash hello
.setopt -s checkhash
l'exécutable haché d'une commande n'existe plus, l'entrée de hachage de cette commande sera mise à jour. Mais notez que chaque session bash a sa propre table de hachage, donc fermer la session et en démarrer une nouvelle videra le hachage. (hash -r
est un moyen plus facile de le faire.)$PATH
ou le lancement d'un nouveau terminal bash semblent nettoyer la table.Voici une utilisation utile de
hash
:Cela signifie: si php n'est pas dans le PATH, utilisez
la source
Oui, le manuel de référence de Bash dit:
Mais vous pouvez désactiver le hachage avec
set +h
:Essayer:
La même chose est pour
hash -r
,hash NAME
etc.Une "détection de commande" (comme ceci ou cela ) ne fonctionne pas:
Vous pouvez écrire quelque chose comme ceci:
ou (grâce à @mikeserv) sans avoir à affecter de nouvelles variables ni à effectuer de tests:
la source
old_options
truc, je fais habituellement quelque chose comme ceci:set -h -- "-${-:--}" "$@"; hash ...; set +h "$@"
ainsi tout se met automatiquement en place sans avoir à assigner de nouvelles variables ou à faire des tests ou quoi que ce soit.Détection facile si une commande est disponible:
la source