hashè un comando incorporato bash. La tabella hash è una funzionalità bash che gli impedisce di cercare $PATHogni 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 hashcomando è 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 $PATHquella 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
PATHdirectory precedente o arriva mvda 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 cpcomando ha causato la visualizzazione di una nuova versione lsdell'eseguibile in precedenza $PATHma non ha attivato l'eliminazione della tabella hash. Ho usato hash -dper eliminare selettivamente la voce lsdalla tabella hash. Bash è stato quindi costretto a controllare di $PATHnuovo 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 $PATHcomportamento "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.