Preferência PATH no bashrc

Preferência PATH no bashrc

Eu queria saber o que acontece na seguinte situação. Suponha que eu tenha um arquivo executável em um diretório que está em PATH em .bashrc. Se eu copiar o arquivo para outro diretório que também esteja definido em PATH e executar esse arquivo no terminal, qual cópia estou executando?

Posso definir uma preferência para dizer “se um arquivo existir em mais de um local dentro do PATH, execute-o em primeiro lugar, em vez de em segundo lugar”.

Responder1

A resposta rápida

Para descobrir qual cópia bashtentará executar, use o utilitário interno do bash type. Para descobrir qual cópia de du, por exemplo, será executada, execute:

$ type du
du is /usr/bin/du

A teoria

Quando você pede bashpara executar algo, bashexecuta duas etapas:

Primeiro, ele verifica o cache em busca da localização do arquivo. Esta é uma lista de nomes de executáveis ​​e onde o arquivo estava localizado na última vez que basho executou.

Segundo, se o arquivo não estiver no cache, ele verifica o caminho, pesquisando cada diretório no caminho, da esquerda para a direita.

Observe que a resposta, então, depende se você executou o executável no shell atual antes de fazer a cópia. Se sim, bashpode ter salvo sua localização no cache e iráignorarquaisquer novos locais onde ele possa estar depois de fazer cópias. Se não estiver no cache, o arquivo executado depende apenas da ordem dos diretórios no caminho.

Mais detalhes

Para ver o que está no cache atual do bash, execute:

$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'

O texto acima mostra que só duestava no cache quando executei isso. Se eu executasse mais comandos e depois executasse novamente, haveria mais no cache.

Para ver qual é o caminho atual, execute:

$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:/usr/X11R6/bin

O caminho é uma lista separada por dois pontos. A imagem acima mostra cinco diretórios no caminho. Eles serão pesquisados ​​começando pela esquerda e trabalhando para a direita.

Posso definir uma preferência?

Sim, você pode alterar a ordem dos diretórios no caminho.

Alternativamente, para trabalho interativo, você pode definir um alias. Por exemplo:

$ alias dd=/opt/bin/dd

Depois que o alias acima for definido, você pode digitar ddna linha de comando e bashirá ignorar o cache e ignorar o PATH e executar (ou tentar executar) /opt/bin/dd.

informação relacionada