it-swarm-pt.tech

Como limpo o cache de caminhos do Bash para executáveis?

Quando executo um programa sem especificar o caminho completo para o executável, e o Bash deve pesquisar os diretórios em $PATH para encontrar o binário, parece que o Bash se lembra do caminho em algum tipo de cache. Por exemplo, instalei uma compilação do Subversion da fonte para /usr/local e digite svnsync help no prompt do Bash. Bash localizou o binário /usr/local/bin/svnsync para "svnsync" e o executou. Então, quando eu apaguei a instalação do Subversion em /usr/local e re-correu svnsync help, Bash responde:

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

Mas, quando inicio uma nova instância do Bash, ele localiza e executa /usr/bin/svnsync.

Como limpo o cache de caminhos para os executáveis?

276
Daniel Trebbien

bash armazena em cache o caminho completo para um comando. Você pode verificar se o comando que você está tentando executar possui um hash com o comando type:

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

Para limpar o cache inteiro:

$ hash -r

Ou apenas uma entrada:

$ hash -d svnsync

Para informações adicionais, consulte help hash e man bash.

349
Tobu

Para limpar apenas uma entrada, você precisa de um sinalizador diferente:

hash -d svnsync

O -r O sinalizador não aceita um parâmetro e sempre exclui o cache inteiro.
(Pelo menos no bash 3.2.39 no Debian Lenny)

27
Aryeh Leib Taurog

Existem soluções não mencionadas aqui.

  1. Você pode desativar o hash com set +h ou set +o hashall

    help set diz:

    -h - Lembre-se da localização dos comandos conforme eles são procurados para execução. Isso é ativado por padrão.

    hashall - o mesmo que -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. Você pode verificar se existe um comando encontrado na tabela de hash antes de tentar executá-lo com shopt -s checkhash

    help shopt diz:

    checkhash - Se definido, o bash verifica se existe um comando encontrado na tabela de hash antes de tentar executá-lo. Se um comando hash não existir mais, uma pesquisa de caminho normal será executada.

    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. Você pode vincular NAME com PATH com hash -p PATH NAME ou 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" executa hash -r

    De variables.c :

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

    Tentar:

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

Como o usuário johntex observou em um comentário a resposta pelo usuário Tob , a ação prática mais simples do Bash é refazer o programa:

hash svnsync

Isso é tudo.

5
Acumenus