Por que uma tabela interna dos diretórios PATH é mantida?

1

Eu estava procurando o que o comando rehash faz e encontrei este :

The rehash command re-computes the internal hash table of the contents of directories listed in the path environmental variable to account for new commands added.

Eu nunca soube de nenhuma tabela de hash interna. Por que e como eles são mantidos?

    
por Lazer 02.08.2010 / 20:34

2 respostas

5

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 .

    
por 02.08.2010 / 22:12
1

Geralmente é simples, embora haja variações entre os shells. Para evitar o E / S desnecessário, o shell mantém nomes executáveis de mapeamento de tabela em seus caminhos completos.

O zsh tem duas opções relacionadas a isso, ambas ativadas por padrão:

HASH_CMDS <D>

Note the location of each command the first time it is executed. Subsequent invocations of the same command will use the saved location, avoiding a path search. If this option is unset, no path hashing is done at all. However, when CORRECT is set, commands whose names do not appear in the functions or aliases hash tables are hashed in order to avoid reporting them as spelling errors.

HASH_DIRS <D>

Whenever a command name is hashed, hash the directory containing it, as well as all directories that occur earlier in the path. Has no effect if neither HASH_CMDS nor CORRECT is set.

Com estas opções, anexar diretórios (e novos comandos) ao PATH deve funcionar como pretendido. No entanto, se você preceder um diretório para o caminho que deve ter precedência sobre um determinado comando (por exemplo, /usr/local/bin/ls ), talvez seja necessário refazer o uso ou reiniciar o shell.

    
por 02.08.2010 / 20:56