Duplications dans la variable d'environnement PATH après démarage du sreveur x

a marqué ce sujet comme résolu.

Bonjour,
Je me suis aperçu récemment que j’avais une partie des chemins de mon PATH se retrouvaient dupliquées une fois le serveur x lancé:

  • à la fin du .xinitrx: /usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:~/bin
  • une fois la sécession graphique lancée: /usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:~/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

J’ai essayé de retrouver dans mes scripts si ça venait d’une ligne mal faite et suis arrivé à la conclusion que non.
Auriez-vous une idée de ce qui est à l’origine de ces duplications?

Merci de votre aide!

Merci de ta réponse!

J’utilise i3wm.
Parmi les fichiers que tu as cités, voici ceux qui touchent au path:

  • dans /etc/profile:
# Append our default paths
appendpath () {
    case ":$PATH:" in
        *:"$1":*)
            ;;
        *)
            PATH="${PATH:+$PATH:}$1"
    esac
}

appendpath '/usr/local/sbin'
appendpath '/usr/local/bin'
appendpath '/usr/bin'
unset appendpath

export PATH
  • dans /etc/profile.d/jvm.sh:
export PATH=${PATH}:/usr/lib/jvm/default/bin
  • dans /etc/proofile.d/perlbin.sh
[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin

[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin

[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl

export PATH

je suppose que le problème viens du fait que perlbin.sh et jvm.sh sont appelés deux fois. Vaut-il mieux faire ne sorte que ce ne soit pas le cas (en modifiant /etc/profile) ou ajouter quelque chose comme append_path dans les fichiers incriminés?

+0 -0

Mmm… Ce qui est bizarre, c’est qu’ils ne devraient pas être exécutés deux fois. Le fichier /etc/profile et ceux dans /etc/profile.d ne sont normalement exécuté que lors d’une connexion (à l’inverse des fichiers de configurations comme .bashrc et cie qui sont exécutés à chaque lancement d’un shell).

Si j’ai bien saisis, tu lances ta session graphique à la main avec startx ou xinit ? Si oui, tu n’utilises pas une option de i3 ou une commande qui provoquerait un second login (comme l’option -l de bash) ?

+0 -0

Voilà:

#
# ~/.xinitrc
#
[[ -f ~/.profile.d/shared_export.sh ]] && source ~/.profile.d/shared_export.sh

export SEARCH_ENGINE="duckduckgo.com"
export LD_PRELOAD=

i3

Et voilà le fichier qui est sourcé:

LIBRARY_PATH="${HOME}/.local/lib/:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH="${LIBRARY_PATH%:}"
export EDITOR="vim"
export PATH="${PATH}:${HOME}/bin"

Je le fais comme ça car ça me permet d’avoir ces variables identiques en tty et une fois en session graphique (bon sauf pour le path manifestement…)

mon fichier .profile est le me que le fichier .initrc (l’un est un lien dur vers l’autre, dans mon souvenir, .xinitrc sert pour utiliser startx ou xinit alors que .profile sert avec un gestionnaire de connexion graphique.).

voici mon .bashrc:

#
# ~/.bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

alias ls='ls --color=auto'
alias grep='grep --color=auto'

#i3 config env var
export I3C="$HOME/.config/i3"

#alias for git config
alias wmc='cd $HOME/.config/i3'

#dotfiles management
alias config='/usr/bin/git --git-dir=$HOME/.cfg --work-tree=$HOME'
complete -F _git config

#sudo completion and editing
complete -cf sudo
alias visudo="sudo -E visudo"


git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

PS1="[\u@\h \W]\$(git_branch)\$ "

#source for auto completion:
source /etc/bash_completion.d/git-flow-completion.bash
source /usr/share/git/completion/git-completion.bash
source /usr/share/bash-completion/bash_completion

aucuns soucis, je suis désolé de ne pas pouvoir être plus utile que donner des fichiers pour l’instant ^^

+0 -0

mon fichier .profile est le me que le fichier .initrc (l’un est un lien dur vers l’autre, dans mon souvenir, .xinitrc sert pour utiliser startx ou xinit alors que .profile sert avec un gestionnaire de connexion graphique.).

charlie02

Mmm… Juste par curiosité, vu que ton fichier .profile est exécuté lors d’une connexion sur un tty, j’en déduis que ta session graphique est démarrée automatiquement ? Si oui, est-ce que tu peux essayer de faire cela manuelement pour voir si cela fait une différence ? Il te suffit de remplacer ton fichier .profile par un fichier vide puis d’exécuter startx une fois sur ton tty.

+0 -0

Non, ma session graphique n’est démarrée qu’une fois que j’ai exécuté startx (c’est pas le fichier .bash_profile qui est lu dans à la connexion en tty?). Avant cela, mon path est normal. J’ai tout de même fais ce que tu as dit avec le fichier .profile, sans résultats…

+0 -0

Pour l’histoire du .bash_profile :

When bash is invoked as an interactive login shell, or as a non-interactive shell with the —login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The —noprofile option may be used when the shell is started to inhibit this behavior.

man bash

Donc apparemment il lit également le .profile, mais après le .bash_profile. Sinon, est-ce que tu m’as bien fourni le fichier /etc/profile complet ? Parce que je me rends compte que la partie devant charger les fichiers présents dans /etc/profile.d n’est pas là. ^^"

Aussi, du coup, si tu as un fichier .bash_profile est-ce que tu peux également m’en montrer le contenu ?

Enfin, s’il ne s’agit du contenu complet des fichiers perlbin.sh et jvm.sh, tu es certain qu’il n’y a rien d’autre qui est susceptible d’influer plus tard sur la variable PATH ?

+0 -0

Désolé je n’ai pas vu la réponse….

Pour l’ordre de chargement, merci pour l’info, je ne savais pas (le manuel de bash est long, mais il faudrait que je prenne le temps de le lire un jour…)

Pour ce qui est du /etc/profile, je n’ai mis que la portion qui touchait au PATH(je pensais que ça suffirait, désolé pour le temps perdu :/), voici l’intégral:

# /etc/profile

# Set our umask
umask 022

# Append our default paths
appendpath () {
    case ":$PATH:" in
        *:"$1":*)
            ;;
        *)
            PATH="${PATH:+$PATH:}$1"
    esac
}

appendpath '/usr/local/sbin'
appendpath '/usr/local/bin'
appendpath '/usr/bin'
unset appendpath

export PATH

# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
    for profile in /etc/profile.d/*.sh; do
        test -r "$profile" && . "$profile"
    done
    unset profile
fi

# Source global bash config
if test "$PS1" && test "$BASH" && test -z ${POSIXLY_CORRECT+x} && test -r /etc/bash.bashrc; then
    . /etc/bash.bashrc
fi

# Termcap is outdated, old, and crusty, kill it.
unset TERMCAP

# Man is much better than us at figuring this out
unset MANPATH
+0 -0

Pour ce qui est du /etc/profile, je n’ai mis que la portion qui touchait au PATH(je pensais que ça suffirait, désolé pour le temps perdu :/), voici l’intégral:

charlie02

Merci et pas de soucis. ;)
Est-ce que je peux te demander le fichier /etc/bash.bashrc, du coup ? ^^"

Et sinon, juste pour être certain :

  • Rien d’autres qui touche au PÄTH dans les fichiers /etc/profile.d/perlbin.sh et /etc/profile.d/perlbin.sh ?
  • Pas de fichier ~/.bash_profile ?
+0 -0

Pour /etc/bash.bashrc:

#
# /etc/bash.bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

[[ $DISPLAY ]] && shopt -s checkwinsize

PS1='[\u@\h \W]\$ '

case ${TERM} in
  xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'

    ;;
  screen*)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
    ;;
esac

[ -r /usr/share/bash-completion/bash_completion   ] && . /usr/share/bash-completion/bash_completion

Pour ce qui est du fichier /etc/perlbin.sh, j’ai mis ce qui touchait au PATH dans ce message, tous le reste du fichier, c’est des commentaires.

Pour le fichier ~/.bash_profile, j’en ai bien un, mais il ne touche pas au PATH:

#
# ~/.bash_profile
#

# Append our default paths
appendload () {
    case ":$LD_PRELOAD:" in
        *:"$1":*)
            ;;
        *)
           export LD_PRELOAD="${LD_PRELOAD:+$LD_PRELOAD:}$1"
    esac
}

appendload "$HOME/.local/lib/libstderred.so"
unset appendload

[[ -f ~/.bashrc ]] && source ~/.bashrc

#complete env
[[ -z $WINDOWID ]] && setterm -blength 0 && \
                  [[ -f ~/.profile.d/shared_export.sh ]] && source ~/.profile.d/shared_export.sh

En revanche le fichier ~/.profile.d/shared_export.sh qu’il source, si:

LIBRARY_PATH="${HOME}/.local/lib/:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH="${LIBRARY_PATH%:}"
export EDITOR="vim"
export PATH="${PATH}:${HOME}/bin"

Mais mon home ne fait pas partie des dossiers duliqués dans le PATH.

En tout cas, merci pour ton aide patiente :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte