Preferência de PATH em bashrc

2

Eu queria saber o que acontece na seguinte situação. Suponha que eu tenha um arquivo executável em um diretório que esteja em PATH em .bashrc. Se eu copiar o arquivo para outro diretório que esteja configurado no PATH também, e eu executar do terminal esse arquivo, 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 esse primeiro lugar em vez daquele em segundo lugar."

    
por user2979409 27.07.2014 / 21:47

1 resposta

4

A resposta rápida

Para descobrir qual cópia bash tentará executar, use o utilitário interno 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ê solicita que bash execute algo, bash executa duas etapas:

Primeiro, ele verifica seu cache para a localização do arquivo. Esta é uma lista de nomes executáveis e onde o arquivo foi 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 depende se você executou o executável no shell atual antes de fazer a cópia. Em caso afirmativo, bash pode ter salvo sua localização no cache e ignorará quaisquer novos locais em que possa estar depois que você fizer cópias. Se não estiver no cache, então qual 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 acima mostra que apenas du estava no cache quando eu corri 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. O acima mostra cinco diretórios no caminho. Eles serão pesquisados a partir da esquerda e trabalhando à direita.

Posso definir uma preferência?

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

Como alternativa, para trabalhos interativos, você pode definir um alias. Por exemplo:

$ alias dd=/opt/bin/dd

Após o alias acima ser definido, você pode digitar dd na linha de comando e bash irá ignorar o cache, ignorar o PATH e executar (ou tentar executar) /opt/bin/dd .

    
por 27.07.2014 / 22:23