it-swarm-eu.dev

Jak vymažu Bashovu mezipaměť cest ke spustitelným souborům?

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?

276
Daniel Trebbien

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.

349
Tobu

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)

27

Zde nejsou uvedena řešení.

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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
    
24

Jak uživatel johntex poznamenal v komentáři k odpověď uživatelem Tob , nejjednodušší praktickou akcí v Bashu je nacvičit jen váš program:

hash svnsync

To je vše.

5
Acumenus