hash
é um comando interno do bash. A tabela de hash é um recurso bash
que impede que seja necessário pesquisar $PATH
toda vez que você digita um comando, armazenando em cache os resultados na memória. A tabela é limpa em eventos que obviamente invalidam os resultados (como modificar $PATH
)
O hash
comando é exatamente como você interage com esse sistema (por qualquer motivo que julgue necessário).
Alguns casos de uso:
Como você viu, imprime quantas vezes você bate em quais comandos, se você digitar sem argumentos. Isso pode lhe dizer quais comandos você usa com mais frequência.
Você também pode usá-lo para lembrar de executáveis em locais fora do padrão.
Exemplo:
[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 ~]#
O que pode ser útil se você apenas tiver um único executável em um diretório fora do $PATH
qual deseja executar, basta digitar o nome em vez de incluir tudo nesse diretório (que seria o efeito se você o incluísse $PATH
).
Geralmente, um alias também pode fazer isso e, como você está modificando o comportamento do shell atual, ele não é mapeado nos programas que você inicia. Um link simbólico para o executável solitário é provavelmente a opção preferida aqui. hash
é uma maneira de fazer isso.
- Você pode usá-lo para não lembrar os caminhos dos arquivos. Isso é útil se um novo executável aparecer em um
PATH
diretório anterior ou chegar mv
a outro lugar e você desejar forçar o bash a sair e encontrá-lo novamente, em vez do último local em que ele se lembra de encontrá-lo.
Exemplo:
[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 ~]#
O cp
comando fez com que uma nova versão do ls
executável aparecesse mais cedo no meu, $PATH
mas não acionou uma limpeza da tabela de hash. Eu costumava hash -d
limpar seletivamente a entrada ls
da tabela de hash. O Bash foi forçado a procurar $PATH
novamente e, quando o encontrou, encontrou-o no local mais recente (anteriormente em $ PATH do que estava sendo executado antes).
Você pode invocar seletivamente o $PATH
comportamento "encontrar novo local do executável de ", no entanto:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
Você preferiria fazer isso principalmente se quisesse algo fora da tabela de hash e não estivesse 100% de que poderia sair e depois voltar com sucesso, ou quis preservar algumas modificações feitas no shell.
Para se livrar de mapeamentos obsoletos, você também pode fazer hash -r
(ou export PATH=$PATH
) o que efetivamente limpa a tabela de hash inteira do bash.
Existem muitas pequenas situações como essa. Não sei se o chamaria de um dos comandos "mais úteis", mas ele tem alguns casos de uso.