Desativar o cache do bash de executáveis no caminho

11

Observe que isso não é duplicado. Estou perguntando sobre desativar o cache, e não limpá-lo. Se você tem um cache para limpar, então obviamente não está desabilitado.

Nas raras ocasiões em que noto o cache de coisas que ele encontrou no caminho, não é porque é útil, é porque é muito chato. Um exemplo:

~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory

Em outro shell ...

~ dc$ which which
/usr/bin/which

Tenho certeza de que esse cache fazia sentido nos bons e velhos tempos, quando os discos eram lentos e a memória era cara e limitada, e você não podia armazenar muito em cache - armazenar em cache um caminho é mais barato do que armazenar em cache todos os blocos de disco necessários encontre um comando. Mas hoje em dia não fornece nenhum benefício perceptível e causa mais problemas do que resolve. É um erro, aproximando-se de ser um bug.

E eu não consigo nem encontrar uma maneira de desativá-lo. Quaisquer ponteiros?

    
por DrHyde 19.08.2014 / 12:48

2 respostas

12

Você pode apenas limpar os executáveis com hash antes que o prompt seja desenhado:

PROMPT_COMMAND='hash -r'

De help hash :

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d                forget the remembered location of each NAME
  -l                display in a format that may be reused as input
  -p pathname       use PATHNAME is the full pathname of NAME
  -r                forget all remembered locations
  -t                print the remembered location of each NAME, preceding
            each location with the corresponding NAME if multiple
            NAMEs are given
Arguments:
  NAME              Each NAME is searched for in $PATH and added to the list
            of remembered commands.

Exit Status:
Returns success unless NAME is not found or an invalid option is given.
    
por 19.08.2014 / 13:48
7

Você pode forçar o bash a fazer uma nova pesquisa de caminho caso um comando na tabela de hash não exista mais.

shopt -s checkhash

A partir da página do bash:

checkhash

    If set, bash checks that a command found in the hash table exists before trying to execute it. If a hashed command no longer exists, a normal path search is performed.

Exemplo:

[blabla]$ PATH=$HOME/bin:$PATH
[blabla]$ hash -r
[blabla]$ cat bin/which
#!/bin/bash
echo "my which"
[blabla]$
[blabla]$ shopt -s checkhash
[blabla]$ which
my which
[blabla]$ mv bin/which bin/dis.which
[blabla]$ which which
/usr/bin/which
    
por 19.08.2014 / 16:38

Tags