O 'hash -p' altera o nome do caminho de um nome de comando externo?

2

No meu ~.profile

PATH="/path/1/":"/path/2/":"$PATH"

/path/1/ e /path/2/ têm arquivos executáveis com o mesmo nome myexecutable .

Em um shell interativo sem logon, gostaria de trocar temporariamente a ordem de pesquisa entre os dois diretórios.

O manual de bash diz para hash

The -p option inhibits the path search, and filename is used as the location of name.

Meu caminho é

$ hash -p /path/2/myexecutable
hits    command
   3    /usr/bin/which
   4    /usr/bin/psql
   1    /bin/cat
  10    /usr/bin/sudo
   1    /bin/mv
   1    /usr/bin/whereis
   3    /bin/mkdir
  19    /bin/ls

a saída é igual a hash e não parece alterar myexecutable para ser /path/2/myexecutable :

$ which myexecutable
/path/1/myexecutable

Então, o que faz hash -p ?

Obrigado.

    
por Tim 24.05.2018 / 23:14

2 respostas

3

De help hash :

hash: hash [-lr] [-p pathname] [-dt] [name ...]

-p pathname use PATHNAME as the full pathname of NAME

Então:

$ hash -p   /path/2/myexecutable   myexecutable

Vai fazer o que quiser.

Claro, você pode jogar alguns jogos com nomes executáveis:

$ hash -p   /bin/echo  myexecutable

Será executado echo sempre que você chamar myexecutable .

$ myexecutable Hello World
Hello World
    
por 25.05.2018 / 00:21
2
$ touch file
$ ls
file
$ hash
hits    command
   1    /usr/bin/touch
   1    /bin/ls
$ hash -p /hello/world/ls ls
$ ls
bash: /hello/world/ls: No such file or directory

hash -p somepath somecommand define o caminho com hash para somecommand para o caminho fornecido somepath in bash .

Isso geralmente não o ajudará a reverter a ordem de pesquisa PATH entre dois diretórios, já que você teria que usar hash -p em todos os binários que ocorrem nos dois diretórios. Se você tiver apenas um desses binários, pode ser uma opção viável. Uma solução mais portátil seria simplesmente preceder o valor de PATH com o segundo diretório.

Se o seu original PATH for

/path/1:/path/2:...

primeiro você o transforma em

/path/2:/path/1:/path/2:...

use hash -r para redefinir os caminhos com hash e use os binários como de costume. Agora, eles serão retirados de /path/2 em vez de /path/1 .

Se você salvar o PATH original em uma variável temporária, será fácil restaurá-lo.

Resumo:

oldpath=$PATH
PATH=/path/2:$PATH
hash -r

# do stuff

PATH=$oldpath
hash -r
    
por 25.05.2018 / 07:52

Tags