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?
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à.
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".
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.