Pourquoi puis-je obtenir des entrées dupliquées dans mon $ PATH?

J'utilise Ubuntu 9.10 (karmique). Et, mon ~/.pam_environment ressemble à ce qui suit.

 PATH DEFAULT=${PATH}:~/Adobe/Reader9/bin:~/texlive/2009/bin/x86_64-linux GIT_EDITOR DEFAULT=vim MANPATH DEFAULT=${MANPATH}:~/texlive/2009/texmf/doc/man INFOPATH DEFAULT=${INFOPATH}:~/texlive/2009/texmf/doc/info 

Mais, echo $PATH renvoie les entrées dupliquées comme suit.

 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:~/Adobe/Reader9/bin:~/texlive/2009/bin/x86_64-linux:~/Adobe/Reader9/bin:~/texlive/2009/bin/x86_64-linux 

J'ai essayé de remplacer DEFAULT par OVERRIDE dans mon fichier ~/.pam_environment . Mais cela n'a pas aidé.

Est-ce que quelqu'un sait ce qui ne va pas avec mon ~/.pam_environment ?

Le problème semble résulter du fait que pam_env est par défaut la lecture de l'utilisateur ~/.pam_environment chaque fois qu'il est invoqué. Beaucoup de méthodes de connexion (cron, lightdm, lightdm-autologin, login, sshd et su sur ma machine) invoquent pam_env deux fois: une fois pour lire les fichiers /etc/environment et ~/.pam_environment et une fois pour lire le /etc/default/locale Fichier /etc/default/locale . Dans aucun des deux cas, le drapeau user_readenv défini, donc pam_env lit et agit sur votre ~/.pam_environment deux fois.

Pour résoudre ce problème, accédez à votre répertoire /etc/pam.d et ajoutez ce qui suit à chaque ligne dans laquelle pam_env est invoqué avec l' envfile=/etc/default/locale :

 user_readenv=0 

Vérifiez votre /etc/pam.d/ que pam_env.so n'est pas chargé deux fois, par exemple, tant dans session qu'en auth .

Pas une réponse, exactement, mais peut-être utile à d'autres qui ont des problèmes de duplication


À partir de la réponse d'acceptation que j'ai reçue à partir de Stack Overflow: Comment puis-je manipuler les éléments $ PATH dans les scripts shell? J'ai développé un ensemble légèrement grand d'outils. La plupart du crédit ici devrait aller à Jonathan Leffler qui a fourni le modèle que j'ai utilisé en les écrivant.

Ajouter sans duplication

 # Insure that a path element exists by adding it to the end if it does not # # $1 name of the shell variable to set (eg PATH) # $3 the path element that we want to insure exists function insure_path () { local path=$1 local list=$(eval echo '$'$path) local pat=$2 checkstr=$(echo "$list" | tr ":" "\n" | grep -Fm 1 "$pat") if [ "$checkstr" ] then true else export $path=$(echo $list:$pat | sed -e 's|\(:\):*|\1|g' -e 's|:$||' -e' s|^:||') fi } # Insure that a path element exists by adding it to the front if it does not # # $1 name of the shell variable to set (eg PATH) # $2 the path element that we want to insure exists function insure_path_front () { local path=$1 local list=$(eval echo '$'$path) local pat=$2 checkstr=$(echo "$list" | tr ":" "\n" | grep -Fm 1 "$pat") if [ $checkstr ] then true else export $path=$(echo $pat:$list | sed -e 's|\(:\):*|\1|g' -e 's|:$||' -e' s|^:||') fi } 

Supprimer les doublons existants

 # Remove duplicates from a path. Preferes the ealiest instance of each # duplicate because this preserves the semantics of the existing path # # $1 name of the shell variable to set (eg PATH) function unduplicate_path () { local path=$1 local list=$(eval echo '$'$path) local split_list=$(echo "$list" | tr ":" " ") local tempp="" # Build the new version of $path from scrath for p in $split_list do insure_path_back tempp $p done # Now replace the existing version export $path=$tempp }