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 bash
tentará 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 bash
para executar algo, bash
executa 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 bash
o 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, bash
pode 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ó du
estava 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 dd
na linha de comando e bash
irá ignorar o cache e ignorar o PATH e executar (ou tentar executar) /opt/bin/dd
.