it-swarm.it

Come posso cancellare la cache di Bash dai percorsi degli eseguibili?

Quando eseguo un programma senza specificare il percorso completo dell'eseguibile e Bash deve cercare le directory in $PATH per trovare il binario, sembra che Bash ricordi il percorso in una sorta di cache. Ad esempio, ho installato una build di Subversion dall'origine a /usr/local, quindi digitato svnsync help al prompt di Bash. Bash ha individuato il binario /usr/local/bin/svnsync per "svnsync" ed eseguito. Quindi, quando ho eliminato l'installazione di Subversion in /usr/local e rieseguito svnsync help, Bash risponde:

bash: /usr/local/bin/svnsync: No such file or directory

Ma, quando avvio una nuova istanza di Bash, trova ed esegue /usr/bin/svnsync.

Come posso cancellare la cache dei percorsi degli eseguibili?

276
Daniel Trebbien

bash memorizza nella cache l'intero percorso di un comando. È possibile verificare che il comando che si sta tentando di eseguire sia sottoposto a hash con il comando type:

$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)

Per cancellare l'intera cache:

$ hash -r

O solo una voce:

$ hash -d svnsync

Per ulteriori informazioni, consultare help hash e man bash.

349
Tobu

Per cancellare solo una voce è necessario un flag diverso:

hash -d svnsync

Il -r flag non accetta un parametro e eliminerà sempre l'intera cache.
(Almeno in bash 3.2.39 su Debian Lenny)

27

Ci sono soluzioni non menzionate qui.

  1. Puoi disabilitare l'hashing con set +h o set +o hashall

    help set dice:

    -h - Ricorda la posizione dei comandi mentre vengono cercati per l'esecuzione. Questo è abilitato di default.

    hashall - Lo stesso di -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. Puoi verificare l'esistenza di un comando trovato nella tabella hash prima di provare a eseguirlo con shopt -s checkhash

    help shopt dice:

    checkhash - Se impostato, bash verifica l'esistenza di un comando trovato nella tabella hash prima di provare a eseguirlo. Se non esiste più un comando con hash, viene eseguita una normale ricerca del percorso.

    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. Puoi associare NAME a PATH con hash -p PATH NAME o 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. Magia: PATH="$PATH" esegue hash -r

    A partire dal variables.c :

    /* What to do just after the PATH variable has changed. */
    void
    sv_path (name)
        char *name;
    {
        /* hash -r */
        phash_flush ();
    }
    

    Provare:

    set -h
    hash -r
    date
    hash # prints 1 /bin/date
    PATH="$PATH"
    hash # prints hash: hash table empty
    
24

Come l'utente johntex ha notato in un commento risposta dall'utente Tob , l'azione pratica più semplice in Bash è quella di ripassare solo il tuo programma:

hash svnsync

È tutto.

5
Acumenus