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?

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 ...


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"

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.