Když spustím program bez zadání úplné cesty ke spustitelnému souboru, Bash musí prohledávat adresáře v $PATH
najít binární, zdá se, že Bash si pamatuje cestu v nějaké mezipaměti. Například jsem nainstaloval sestavení Subversion ze zdroje na /usr/local
, poté zadejte svnsync help
na Bash Prompt. Bash lokalizoval binární /usr/local/bin/svnsync
pro "svnsync" a provedl to. Když jsem odstranil instalaci Subversion v /usr/local
a znovu spuštěno svnsync help
, Bash odpovídá:
bash: /usr/local/bin/svnsync: No such file or directory
Když ale spustím novou instanci Bash, najde a provede /usr/bin/svnsync
.
Jak vymažu mezipaměť cest ke spustitelným souborům?
bash
ukládá do mezipaměti úplnou cestu k příkazu. Ověřením, že příkaz, který se pokoušíte provést, je hashovaný příkazem type
:
$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)
Vymazání celé mezipaměti:
$ hash -r
Nebo jen jeden záznam:
$ hash -d svnsync
Další informace získáte na webu help hash
a man bash
.
K vymazání pouze jedné položky potřebujete jiný příznak:
hash -d svnsync
Příznak -r
Nebere parametr a vždy smaže celou mezipaměť.
(Alespoň v bash 3.2.39 na Debianu Lenny)
Zde nejsou uvedena řešení.
Můžete zakázat hašování pomocí set +h
Nebo set +o hashall
help set
Říká:
-h - Pamatujte na umístění příkazů, jak jsou vyhledávány k provedení. Ve výchozím nastavení je to povoleno.
hashall - Stejné jako -h
set -h # enable hashing
shopt -u checkhash # disable command existence check
hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
date # bash: /some/nonexisting/dir/date: No such file or directory
set +h
date # normal date output
Než se pokusíte provést příkaz shopt -s checkhash
, Můžete zkontrolovat, zda existuje příkaz nalezený v hašovací tabulce.
help shopt
Říká:
checkhash - Pokud je nastaveno, bash zkontroluje, zda existuje příkaz nalezený v hašovací tabulce před pokusem o jeho provedení. Pokud již hashovaný příkaz neexistuje, provede se normální hledání cesty.
set -h # enable hashing
shopt -u checkhash # disable command existence check
hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
hash -t date # prints /some/nonexisting/dir/date
date # bash: /some/nonexisting/dir/date: No such file or directory
shopt -s checkhash # enable command existence check
date # normal date output
hash -t date # prints /bin/date
Můžete spojit NAME s PATH pomocí hash -p PATH NAME
Nebo BASH_CMDS[NAME]=PATH
:
shopt -u checkhash # disable command existence check
hash -p /some/nonexisting/dir/date date
date # bash: /some/nonexisting/dir/date: No such file or directory
BASH_CMDS[date]=/bin/date
date # normal date output
Kouzlo: PATH="$PATH"
Provádí hash -r
Od variables.c
:
/* What to do just after the PATH variable has changed. */
void
sv_path (name)
char *name;
{
/* hash -r */
phash_flush ();
}
Snaž se:
set -h
hash -r
date
hash # prints 1 /bin/date
PATH="$PATH"
hash # prints hash: hash table empty