Tmux "trie" la variable PATH?

14

J'ai un problème reproductible:

  1. configurer mon PATH dans Bash .profile
  2. commencer par tmux tmux, tmux attachou toute variante
  3. echo $ PATH et le voir avec les mêmes composants mais dans un ordre différent

Comment arrêter ça? Qu'est-ce qui l'explique?

Robottinosino
la source

Réponses:

29

Si vous êtes sur un Mac et que vous vous demandez pourquoi /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bincontinue d'être ajouté à PATH lorsque vous exécutez tmux, c'est à cause d'un utilitaire appelé path_helper qui est exécuté à partir de votre /etc/profilefichier.

Vous ne pouvez pas facilement persuader tmux (ou plutôt bash) de ne pas source /etc/profile(pour une raison quelconque, tmux s'exécute toujours comme un shell de connexion, ce qui signifie que / etc / profile sera lu), mais vous pouvez vous assurer que les effets de path_helper ne ne vis pas avec votre PATH.

L'astuce consiste à s'assurer que PATH est vide avant l'exécution de path_helper. Dans mon ~/.bash_profiledossier, j'ai ceci:

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

La suppression de PATH avant l'exécution de path_helper l'empêchera d'ajouter le PATH par défaut à votre PATH (précédemment) choisi et permettra au reste de vos scripts de configuration bash personnels (commandes plus bas .bash_profile, ou .bashrcsi vous l'avez obtenu .bash_profile) de configurer votre CHEMIN en conséquence.

J'espère que cela a du sens ...

Graham Ashton
la source
1
Cela l'a totalement fait pour moi! Je l'ai moi-même caché derrière une if [ -n "$TMUX" ]clause, mais je me demandais - dans quelle mesure est-ce [ -f /etc/profile ]vraiment important? N'est-il pas sûr de supposer qu'il /etc/profiles'agit toujours d'un fichier normal?
Ryan Lue
1
@RyanLue Vous pouvez facilement remplacer -fpar -e, mais je n'essaierais pas personnellement de récupérer un fichier à partir d'un script qui s'exécute lorsque je me connecte, sauf si je l'ai vérifié. Cependant, j'ai tendance à réutiliser mon script bash sur de nombreuses machines (et systèmes d'exploitation) différents, donc j'aime m'assurer qu'ils sont à l'épreuve des balles. Je peux imaginer que d'autres variantes d'Unix pourraient l'appeler autrement.
Graham Ashton
MERCI! Cela me rendait fou et ~/.bash_profileje mettais ce petit extrait au sommet de ma santé mentale dans mon monde tmux heureux.
hoosierEE
Si vous ne voulez pas salir avec les valeurs par défaut du système, set -g default-command "${SHELL}"dans les .tmux.confforces Tmux utiliser des coquilles non-connexion. Je ne vois pas l'intérêt de ceux-ci de toute façon, car vous ouvrez habituellement tmux après vous être déjà connecté.
seeker_of_bacon
5

Non; le tri $PATHserait une chose trop folle à faire, car de nombreux systèmes dépendent de son ordre défini par l'utilisateur.

Cependant, tmux ne démarrer votre shell en mode « connexion », ce qui ~/.profiledoit être source de nouveau . Cela signifie que si vous avez quelque chose comme PATH=/my/dir:/another/dir:$PATHdans ce fichier, cela sera fait à nouveau , résultant en $ PATH contenant /my/dir:/another/dir:/my/dir:/another/dir:(etc.). Pour éviter cela, vous pouvez utiliser une autre variable pour vérifier:

if [ "$_SKIP_PROFILE" ]; then
    return 0
else
    export _SKIP_PROFILE=y
fi

export PATH="/my/dir:/another/dir:$PATH"
user1686
la source
0

@Graham Ashton Merci pour votre idée

Ma suggestion serait que vous mettiez

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

à votre fichier .zshrc en haut de celui-ci.

ASSUREZ-VOUS que votre

export NVM_DIR="$HOME/.nvm"
. "/usr/local/opt/nvm/nvm.sh"

est inférieure à.

sunsoft
la source