Manipulação de nomes de programas duplicados

3

Gostaria de saber se as entradas $PATH em cascata . Vocês todos precisam dar um salto de fé comigo aqui, mas aqui vai.

Digamos que temos um executável Java em /usr/bin/java , mas essa versão é muito antiga e desatualizada. Infelizmente, não temos su access, então não podemos simplesmente substituí-lo. Podemos, no entanto, baixar a versão atual do JRE / JDK localmente e apontar para a versão atualizada. Minha pergunta é: como o bash lida com o caso em que temos dois ou mais executáveis com o mesmo nome, mas em dois ou mais locais diferentes ? O bash de alguma forma escolhe qual deles executar quando digitarmos java no console? Assumindo que /usr/bin tem muitos outros executáveis que precisamos, como o $PATH procuraria algo como isto para funcionar corretamente?

Idealmente, quando digitarmos java -version , veremos:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

em vez de

java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) Client VM(build 24.45-b08, mixed mode, sharing)

Tenho certeza de que esta pergunta foi feita antes e tem algum tipo de jargão associado a ela. Eu procurei por SE, SO e alguns fóruns, mas não achei nada conclusivo.

    
por djthoms 16.01.2016 / 09:41

2 respostas

5

Seu $PATH é pesquisado sequencialmente. Por exemplo, se echo $PATH mostrar /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin , cada um desses diretórios será pesquisado em sequência para um determinado comando (supondo que o comando não seja um alias ou um shell embutido).

Se você deseja substituir binários específicos por usuário (ou simplesmente não tem acesso à substituição para outros usuários além de você mesmo), recomendamos criar um diretório bin em seu diretório inicial e, em seguida, prefixando sua variável PATH com esse diretório.

Assim:

$ cd ~
$ pwd
/home/joe
$ mkdir bin
$ echo "$PATH"
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
$ echo 'export PATH="$HOME/bin:$PATH"' >> .bash_profile

Em seguida, source .bash_profile , para que a nova definição de PATH tenha efeito (ou apenas efetue logout e login, ou reinicie seu emulador de terminal).

$ source .bash_profile
$ echo "$PATH"
/home/joe/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

Agora, todos os arquivos executáveis que você colocar em /home/joe/bin/ terão precedência sobre os binários e executáveis do sistema.

Observe que, se você fizer o acesso ao sistema e as substituições se aplicarem a todos os usuários, o local preferido para colocar os executáveis será /usr/local/bin , que é destinado a essa finalidade. Na verdade, muitas vezes /usr/local/bin é o primeiro diretório em $PATH especificamente para permitir isso.

    
por 16.01.2016 / 09:54
2

O Bash (e, na verdade, todos os shells) executará o arquivo primeiro encontrado no nome dado à pesquisa na ordem definida pelo $ PATH no ambiente.

Ou simplesmente: O primeiro executável encontrado na ordem $ PATH.

    
por 16.01.2016 / 09:55