Onde a minha variável PATH está sendo definida?

4

Estou tentando definir minha variável de caminho para ficar assim:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jgrande/android-sdk-linux/platform-tools:/usr/lib/jvm/java-7-openjdk-amd64/bin/:/usr/lib/jvm/java-7-openjdk-amd64/jre/bin

E por alguns motivos, não importa o arquivo que eu edito, a variável sempre acaba ficando assim (com o caminho java repetindo várias vezes):

PATH=/usr/local/java/jdk1.7.0_79/bin:/home/jgrande/bin:/usr/local/java/jdk1.7.0_79/bin:/home/jgrande/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/java/jdk1.7.0_79/bin:/usr/local/java/jdk1.7.0_79/jre/bin:/usr/local/java/jdk1.7.0_79/bin:/usr/local/java/jdk1.7.0_79/jre/bin

Eu tentei editar meus .bashrc e .profile , assim como /etc/environment , /etc/bash.bashrc , /etc/profile , e defini-lo em /etc/profile.d . Agora, há jdk.sh em /etc/profile.d , onde a variável PATH é idêntica à incorreta que postei acima. No entanto, tentei comentar a linha e até mesmo remover jdk.sh e isso ainda não resolveu.

Caso contrário, notei que, se eu fizer login como outro usuário, terei a variável PATH correta e não a confundida com o java sendo repetido várias vezes.

Então, eu estava pensando, onde mais poderia ser definida minha variável PATH que ainda não verifiquei?

    
por user1617942 04.12.2015 / 16:28

3 respostas

4

Você aplicou um furacão de aleatoriedade nas suas configurações!

Se você não conseguir desfazer suas edições nos arquivos em /etc , talvez seja necessário reinstalar bash !

Você pode ajustar seu PATH sem alterar nenhum arquivo em /etc . Por exemplo, leia estas respostas . Eu, claro, prefiro minha resposta.

Você pode determinar exatamente onde está se desviando lendo man bash , man less e com um olho na seção INVOCATION de man bash , use less nos arquivos de inicialização. Sempre que parecerem transferir o controle ( source , . ), use o comando less ! para ler esse arquivo. Use o comando less / para procurar a string PATH= para localizar PATH atribuições em cada arquivo. Lembre-se de ser tão burro quanto bash .

Você pode comparar (com diff ) os arquivos de inicialização ( .bashrc , .profile , .bash_login ) entre seu $HOME e o de "outro usuário".

    
por waltinator 04.12.2015 / 19:54
3

O PATH pode ser definido em qualquer uma das várias leituras do arquivo quando ele é iniciado. Para encontrá-los, execute isto:

grep --color -H 'PATH=' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login \
                     ~/.bash_aliases /etc/bash.bashrc /etc/profile \
                     /etc/profile.d/* /etc/environment 2> /dev/null

Esses são os padrões. Se você também estiver obtendo outros arquivos de um desses, as coisas podem ficar mais complexas.

De qualquer forma, para corrigi-lo-supondo que você não tenha feito nada para os arquivos globais em /etc/ -você pode executar este:

sed -i '/PATH=/d' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login ~/.bash_aliases 

Isso excluirá qualquer configuração de linhas PATH desses arquivos. Agora, adicione o caminho certo no lugar certo:

pp='PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jgrande/android-sdk-linux/platform-tools:/usr/lib/jvm/java-7-openjdk-amd64/bin/:/usr/lib/jvm/java-7-openjdk-amd64/jre/bin'
[[ -e '~/.bash_profile' ]] && echo "$pp" >> ~/bash_profile ||
                              echo "$pp" >> ~/.profile

Quando invocado como um shell de login, o bash lê .bash_profile se presente e, se não, lê ~/.profile (ele irá ignorar .profile se .bash_login estiver presente, mas eu suponho que não é). Portanto, os comandos acima primeiro salvarão o caminho desejado como $pp e, em seguida, verificarão se existe um ~/.bash_profile , adicionarão a definição de caminho a ele se o fizer e, se isso não ocorrer, o adicionará a ~/.profile .

No futuro, para evitar este tipo de problema, use uma função para adicionar diretórios para sua $PATH . Adicione estas linhas ao seu ~/.profile :

pathmunge () 
{ 
    if ! echo $PATH | /bin/egrep -q "(^|:)($|:)"; then
        if [ "" = "after" ]; then
            PATH=$PATH:;
        else
            PATH=:$PATH;
        fi;
    fi
}

Em seguida, acrescentar algo ao início de sua $PATH , adicione esta linha para ~/.profile :

pathmunge "/path/to/foo"

E para adicioná-lo ao final:

pathmunge "/path/to/foo" after

A função só adicionará um novo diretório ao $PATH , se ainda não estiver lá.

    
por terdon 05.12.2015 / 00:30
0

Eu procuraria o programa que está configurando a parte incomum do $ PATH contendo:

/usr/local/java/jdk1.7.0_79/bin

Execute isso no terminal:

sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "/usr/local/java/jdk1.7.0_79/bin"

Isso pesquisará todos os diretórios no seu sistema, excluindo os diretórios do sistema de arquivos virtual. Se o primeiro diretório no $ PATH não for o culpado, pesquise o último:

/usr/lib/jvm/java-7-openjdk-amd64/jre/bin

grep retornará o nome do script / arquivo que está definindo o $ PATH.

    
por WinEunuuchs2Unix 29.08.2018 / 01:01