Sortiert tmux die Variable PATH?

14

Ich habe ein reproduzierbares Problem:

  1. Richten Sie meinen Pfad in Bash .profile ein
  2. Start tmux durch tmux, tmux attachoder jede Variante
  3. Echo $ PATH und sehen Sie es mit den gleichen Komponenten, aber in unterschiedlicher Reihenfolge

Wie kann man das aufhalten? Was erklärt es?

Robottinosino
quelle

Antworten:

29

Wenn Sie auf einem Mac arbeiten und sich gefragt haben, warum /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/binPATH beim Ausführen von tmux immer wieder vorangestellt wird, liegt dies an einem Dienstprogramm namens path_helper, das in Ihrer /etc/profileDatei ausgeführt wird.

Sie können tmux (oder besser gesagt bash) nicht einfach davon überzeugen, keine Quelle zu verwenden /etc/profile(aus irgendeinem Grund wird tmux immer als Anmeldeshell ausgeführt, was bedeutet, dass / etc / profile gelesen wird), aber Sie können sicherstellen, dass die Auswirkungen von path_helper nicht zutreffen Schrauben Sie nicht mit Ihrem Pfad.

Der Trick besteht darin, sicherzustellen, dass PATH leer ist, bevor path_helper ausgeführt wird. In meiner ~/.bash_profileDatei habe ich Folgendes:

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

Durch das Löschen von PATH vor der Ausführung von path_helper wird verhindert, dass der Standard-PATH dem (zuvor) ausgewählten PATH vorangestellt wird, und der Rest Ihrer persönlichen Bash-Setup-Skripte (Befehle weiter unten .bash_profileoder in, .bashrcwenn Sie ihn bezogen haben .bash_profile) kann eingerichtet werden PFAD entsprechend.

Hoffe das macht Sinn ...

Graham Ashton
quelle
1
Das hat es total für mich getan! Ich habe es selbst hinter einer if [ -n "$TMUX" ]Klausel versteckt , aber ich habe mich gefragt - wie wichtig ist das [ -f /etc/profile ]wirklich? Ist es nicht sicher anzunehmen, dass /etc/profilees sich immer um eine reguläre Datei handelt?
Ryan Lue
1
@RyanLue Sie bequem ersetzen könnten -fmit -e, aber ich würde eine Datei nicht persönlich versuchen und Quelle von einem Skript , das ausgeführt wird , wenn ich mich anmelden , wenn ich es war geprüft würde. Ich neige jedoch dazu, mein Bash-Skript auf vielen verschiedenen Computern (und Betriebssystemen) wiederzuverwenden, daher möchte ich sicherstellen, dass sie kugelsicher sind. Ich kann mir vorstellen, dass einige andere Unix-Varianten es etwas anderes nennen könnten.
Graham Ashton
DANKE! Das machte mich verrückt und brachte diesen kleinen Ausschnitt ganz oben ~/.bash_profileauf meine geistige Gesundheit zurück in meine glückliche tmux-Welt.
HoosierEE
Wenn Sie mit Systemstandards zu verwirren wollen, nicht set -g default-command "${SHELL}"in .tmux.confKräften tmux Nicht-Login - Shells zu verwenden. Ich sehe den Punkt in diesen sowieso nicht, da Sie normalerweise tmux öffnen, nachdem Sie sich bereits angemeldet haben.
seeker_of_bacon
5

Nein; Das Sortieren $PATHwäre zu verrückt, da viele Systeme von der vom Benutzer festgelegten Reihenfolge abhängen.

Allerdings tmux hat Shell in „Login“ -Modus starten, verursacht ~/.profilewerden sourced wieder . Dies bedeutet, dass wenn Sie so etwas PATH=/my/dir:/another/dir:$PATHin dieser Datei haben, es erneut ausgeführt wird , was dazu führt, dass $ PATH enthält /my/dir:/another/dir:/my/dir:/another/dir:(etc.). Um dies zu vermeiden, können Sie eine andere Variable verwenden, um Folgendes zu überprüfen:

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

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

@ Abraham Ashton Danke für deine Idee

Mein Vorschlag wäre, dass Sie setzen

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

in Ihrer .zshrc-Datei oben.

Stellen Sie sicher, dass Ihre

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

ist unterhalb.

Sunsoft
quelle