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.
hash
comando usa internamente uma tabela de hash para armazenar os mapeamentos. pt.wikipedia.org/wiki/Hash_tablehash
não sendobash
específico, o comando se originou no shell Bourne no SVR2 (embora o recurso de caminhos de hash dos comandos venhacsh
antes disso) e é encontrado em todos os shells tipo Bourne e POSIX.export PATH=$PATH
limpar a tabela,hash -r
deve ser suficiente.hash -r
ou obterá a versão antiga porque $ PATH não mudou e, portanto, o Bash não percebe que poderia carregar o mesmo programa de um diretório anterior (de maior prioridade). Veja conda.pydata.org/docs/… para detalhes.Aqui está o uso clássico, simplificado:
fonte
hash hello
.setopt -s checkhash
o executável de hash de um comando não existir mais, a entrada de hash desse comando será atualizada. Mas observe que cada sessão do bash tinha sua própria tabela de hash, portanto, fechar a sessão e iniciar uma nova esvazia efetivamente o hash. (hash -r
é uma maneira mais fácil de fazer isso.)$PATH
ou o lançamento de um novo terminal do bash parecem limpar a tabela.Aqui está um uso útil de
hash
:Significa: se o php não estiver no PATH, use
fonte
Sim, o Manual de Referência do Bash diz:
Mas você pode desativar o hash com
set +h
:Experimentar:
O mesmo é para
hash -r
,hash NAME
etcA "detecção de comando" (como este ou que ) não funciona:
Você pode escrever algo como isto:
ou (graças a @mikeserv) sem precisar atribuir novas variáveis ou fazer testes:
fonte
old_options
- eu costumo fazer algo assim:set -h -- "-${-:--}" "$@"; hash ...; set +h "$@"
então tudo se encaixa automaticamente sem precisar atribuir novas variáveis ou fazer testes ou o que for.Fácil detecção se um comando está disponível:
fonte