Conforme você digita comandos dentro de um shell bash, o shell está procurando por aqueles comandos através da variável $ PATH. O hash é apenas um índice de quais comandos você digitou e onde eles foram encontrados para ajudar a acelerar a descoberta deles na próxima vez.
NOTA: @ resposta do Anthon dá uma boa definição do que hash é!
Por exemplo, se você executar apenas o comando hash
sem argumentos, obterá uma lista de quais comandos foram encontrados anteriormente junto com quantas vezes eles foram usados (por exemplo, hits):
% hash
hits command
2 /usr/bin/host
1 /bin/more
1 /home/saml/bin/autossh_mail.sh
3 /usr/bin/zip
2 /bin/rm
2 /bin/date
2 /usr/bin/vim
1 /usr/bin/htop
2 /bin/mv
3 /bin/ps
8 /usr/bin/ssh
1 /usr/bin/yum
1 /usr/bin/xfreerdp
1 /bin/cp
2 /bin/mkdir
4 /usr/bin/man
1 /usr/bin/gvim
1 /usr/bin/unzip
1 /usr/bin/w
5 /usr/bin/nslookup
51 /bin/ls
15 /usr/bin/find
O comando hash node
retorna um valor de status (0 ou 1) dependendo se esse valor estava presente na lista de hash ou não:
hash node
não está na minha lista
% hash node
bash: hash: node: not found
% echo $?
1
NOTA: O status de qualquer comando executado anteriormente é armazenado temporariamente em uma variável de ambiente $? . É onde o status (0 = sucesso, 1 = falha) é colocado após cada comando ser executado.
A construção "cmd1" || {"cmd2" ...} é uma declaração ou. Pense e / ou da lógica aqui. Então isso significa fazer a primeira coisa, se falhar, então faça a segunda, caso contrário não faça a segunda coisa.
Um exemplo mais elaborado:
% true && echo "1st cmd ret. 1" || echo "1st cmd ret. 0"
1st cmd ret. 1
% false && echo "1st cmd ret. 1" || echo "1st cmd ret. 0"
1st cmd ret. 0
A lógica é sempre confusa (pelo menos para mim) porque um 1 sendo retornado significa que o comando falhou, enquanto um 0 sendo retornado significa que ele foi executado com êxito.