web-dev-qa-db-fra.com

Où est définie ma variable PATH?

J'essaie de définir ma variable de chemin pour qu'elle ressemble à ceci:

/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

Et pour certaines raisons, quel que soit le fichier que je modifie, la variable a toujours l'aspect suivant (avec le chemin Java répétant plusieurs fois):

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

J'ai essayé de modifier mes .bashrc et .profile personnels ainsi que /etc/environment, /etc/bash.bashrc, /etc/profile et de le définir dans /etc/profile.d. Maintenant, il y a jdk.sh dans /etc/profile.d où la variable PATH est identique à la variable incorrecte indiquée ci-dessus. Cependant, j'ai essayé de commenter la ligne et même de supprimer jdk.sh et cela n'a toujours pas résolu le problème.

Sinon, j'ai remarqué que si je me connecte en tant qu'autre utilisateur, j'aurai la bonne variable PATH et que la variable dérangée avec Java ne sera pas répétée plusieurs fois.

Alors, je me demandais, où d’autre pourrait-on définir ma variable PATH que je n’ai pas encore vérifiée?

7
user1617942

Le PATH peut être défini dans l’un des fichiers que bash lit au démarrage. Pour les trouver tous, lancez ceci:

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

Ce sont les standards. Si vous recherchez également d'autres fichiers à partir de l'un de ces fichiers, la situation peut devenir plus complexe.

Quoi qu'il en soit, pour résoudre ce problème - en supposant que vous n'avez rien fait pour les fichiers globaux dans /etc/ - vous pouvez exécuter ceci:

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

Cela supprimera toutes les lignes réglant PATH de ces fichiers. Maintenant, ajoutez le bon au bon endroit:

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

Lorsqu'il est appelé en tant que shell de connexion, bash lit .bash_profile s'il est présent et sinon, il lit ~/.profile (il ignorera .profile si .bash_login est présent mais je suppose qu'il ne l'est pas. 't). Ainsi, les commandes ci-dessus vont d’abord enregistrer votre chemin souhaité sous le nom $pp, puis vérifier si un ~/.bash_profile existe, ajoutez-y la définition du chemin et, s’il ne le fait pas, il l’ajoute. à ~/.profile.

À l'avenir, pour éviter ce genre de problème, utilisez une fonction pour ajouter des répertoires à votre $PATH. Ajoutez ces lignes à votre ~/.profile:

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

Ensuite, pour ajouter quelque chose au début de votre $PATH, ajoutez cette ligne à ~/.profile:

pathmunge "/path/to/foo"

Et pour l'ajouter à la fin:

pathmunge "/path/to/foo" after

La fonction ajoutera un nouveau répertoire au $PATH s'il n'y est pas déjà.

7
terdon

Vous avez appliqué un ouragan de hasard à vos configs!

Si vous ne pouvez pas annuler vos modifications des fichiers dans /etc, vous devrez peut-être réinstaller bash!

Vous pouvez ajuster votre PATH personnel sans changer aucun fichier dans /etc. Par exemple, lisez ces réponses . Je préfère bien sûr ma réponse.

Vous pouvez déterminer exactement où vous vous égarez en lisant man bash, man less, et avec un œil sur la section INVOCATION de man bash, utilisez less sur le fichiers de démarrage. Chaque fois qu'ils semblent transférer le contrôle (source, .), utilisez la commande less's ! pour lire ce fichier. Utilisez la commande / de less pour rechercher la chaîne PATH= afin de rechercher les affectations PATH dans chaque fichier. N'oubliez pas d'être aussi bête que bash.

Vous pouvez comparer (avec diff) les fichiers de démarrage (.bashrc, .profile, .bash_login) entre votre $HOME et celui d'un "autre utilisateur".

4
waltinator

Pour trouver tous les endroits où la variable d'environnement $PATH est modifiée, utilisez ceci:

Sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "PATH="

Ceci recherchera tous les répertoires de votre système, à l'exception des répertoires de système de fichiers virtuels. Dans mon cas, avec trois distributions montées, 697 fichiers sont renvoyés.


Une approche plus ciblée pour OP consiste à rechercher un nom de chemin spécifique. Vous pouvez rechercher le programme qui définit la partie inhabituelle de $ PATH contenant:

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

Exécutez ceci dans le 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"

Si le premier répertoire du $ PATH n'est pas le coupable, recherchez le dernier:

/usr/lib/jvm/Java-7-openjdk-AMD64/jre/bin

grep renverra le nom du script/fichier qui définit le $ PATH.

1
WinEunuuchs2Unix