hash
è un comando incorporato bash. La tabella hash è una funzionalità bash
che gli impedisce di cercare $PATH
ogni volta che si digita un comando memorizzando nella cache i risultati. La tabella viene cancellata dagli eventi che ovviamente invalidano i risultati (come la modifica $PATH
)
Il hash
comando è proprio il modo in cui interagisci con quel sistema (per qualsiasi motivo ti senti necessario).
Alcuni casi d'uso:
Come hai visto, stampa quante volte premi quali comandi se lo digiti senza argomenti. Questo potrebbe dirti quali comandi usi più spesso.
Puoi anche usarlo per ricordare gli eseguibili in posizioni non standard.
Esempio:
[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 ~]#
Il che potrebbe essere utile se hai solo un singolo eseguibile in una directory esterna a $PATH
quella che vuoi eseguire semplicemente digitando il nome invece di includere tutto in quella directory (che sarebbe l'effetto se lo aggiungessi a $PATH
).
Un alias di solito può fare anche questo, anche se e poiché stai modificando il comportamento della shell corrente, non è mappato nei programmi che avvii. Un collegamento simbolico all'eseguibile solitario è probabilmente l'opzione preferibile qui. hash
è un modo per farlo.
- Puoi usarlo per non ricordare i percorsi dei file. Questo è utile se un nuovo eseguibile appare in una
PATH
directory precedente o arriva mv
da qualche altra parte e vuoi forzare l'uscita di bash e trovarlo di nuovo invece dell'ultimo posto in cui ricorda di averlo trovato.
Esempio:
[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 ~]#
Il cp
comando ha causato la visualizzazione di una nuova versione ls
dell'eseguibile in precedenza $PATH
ma non ha attivato l'eliminazione della tabella hash. Ho usato hash -d
per eliminare selettivamente la voce ls
dalla tabella hash. Bash è stato quindi costretto a controllare di $PATH
nuovo e quando lo ha fatto, lo ha trovato nella posizione più recente (prima in $ PATH di quanto non fosse in esecuzione prima).
È possibile richiamare selettivamente questo $PATH
comportamento "trova nuova posizione dell'eseguibile da ", sebbene:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
Avresti principalmente voluto farlo se volevi qualcosa fuori dalla tabella hash e non eri al 100% che potresti disconnetterti e poi rientrare con successo, o se volevi conservare alcune modifiche che hai apportato alla tua shell.
Per sbarazzarsi delle mappature obsolete, puoi anche fare hash -r
(o export PATH=$PATH
) che effettivamente elimina l'intera tabella hash di bash.
Ci sono molte piccole situazioni del genere. Non so se lo definirei uno dei comandi "più utili" ma ha alcuni casi d'uso.