Quando você insere um comando, se não houver nenhuma tabela de hash, o shell verificará todos os diretórios listados na variável $PATH
para ver se seu comando está localizado lá.
Isso pode ser um processo lento se algum desses diretórios estiver conectado a um dispositivo lento. Você teria uma pausa toda vez que digitar um comando.
Assim, quando o shell começa a ser executado, ele lê todos os diretórios no $PATH
e determina quais são todos os programas executáveis e, em seguida, armazena essa lista em uma tabela de hash na memória. Então, ele nunca precisa verificá-los novamente, e pode saber rapidamente se um comando que você digitou é válido ou não.
Isso funciona muito bem, desde que você nunca adicione ou remova programas, porque, assim que você fizer isso, a tabela de hash estará desatualizada. A finalidade do comando rehash
é pedir ao shell para ir e ler a lista de programas novamente.
O acima aplica-se a csh
e tcsh
.
Com o shell bash
, ele não lê os nomes de todos os seus programas na inicialização. Ele mantém uma tabela de hash, mas apenas coloca as coisas enquanto você digita comandos. Por exemplo:
bash-3.2$ ls
foo bar baz
bash-3.2$ cp
cp: missing file operand
Try 'cp --help' for more information.
bash-3.2$ hash
hits command
1 /bin/cp
1 /bin/ls
Ele lembrou os locais dos comandos cp
e ls
.