hash
é um comando interno do bash. A tabela de hash é um recurso do bash
que impede que ele tenha que 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 comando hash
é exatamente como você interage com esse sistema (por qualquer motivo que você ache que precisa).
Alguns casos de uso:
-
Como você viu, ele imprime quantas vezes você bateu em quais comandos, se você digitar sem argumentos. Isso pode dizer quais comandos você usa com mais frequência.
-
Você também pode usá-lo para lembrar executáveis em locais não 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ê tiver apenas um único executável em um diretório fora de $PATH
que deseja executar, basta digitar o nome em vez de incluir tudo nesse diretório (o que seria o efeito se você o adicionasse a $PATH
).
Um alias normalmente também pode fazer isso, e como você está modificando o comportamento do shell atual, ele não é mapeado em programas iniciados. Um link simbólico para o executável solitário é provavelmente a opção preferível aqui. hash
é uma maneira de fazer isso.
- Você pode usá-lo para cancelar o caminho dos arquivos. Isso é útil se um novo executável aparecer em um diretório
PATH
anterior ou se obtivermv
'd em algum outro lugar e você quiser forçar o bash a sair e encontrá-lo novamente, em vez do último lugar em que 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 comando cp
fez com que uma nova versão do executável ls
aparecesse mais cedo no meu $PATH
, mas não acionou uma limpeza da tabela de hash. Eu usei hash -d
para remover seletivamente a entrada para ls
da tabela de hash. O Bash foi forçado a procurar por $PATH
novamente e, quando o fez, encontrou-o no local mais novo (anteriormente em $ PATH do que estava em execução antes).
Você pode invocar seletivamente esse comportamento "encontrar nova localização de executável no $PATH
":
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
Você geralmente só quer fazer isso se quiser algo fora da tabela de hash e não foi 100% que você poderia fazer logout e depois voltar com sucesso, ou você queria preservar algumas modificações que você fez na sua concha.
Para se livrar dos mapeamentos obsoletos, você também pode fazer hash -r
(ou export PATH=$PATH
), que limpa apenas toda a tabela de hash do bash.
Existem muitas situações pequenas como essa. Não sei se o chamaria de um dos comandos "mais úteis", mas tem alguns casos de uso.