Czy tmux „sortuje” zmienną PATH?

14

Mam powtarzalny problem:

  1. skonfiguruj moją ŚCIEŻKĘ w Bash .profile
  2. rozpocząć tmux przez tmux, tmux attachlub dowolnego wariantu
  3. echo $ PATH i zobacz to z tymi samymi komponentami, ale w innej kolejności

Jak to zatrzymać? Co to wyjaśnia?

Robottinosino
źródło

Odpowiedzi:

29

Jeśli korzystasz z komputera Mac i zastanawiasz się, dlaczego /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/binciągle uruchamiasz PATH po uruchomieniu tmux, dzieje się tak z powodu narzędzia o nazwie ścieżka_pomoc, które jest uruchamiane z Twojego /etc/profilepliku.

Nie możesz łatwo przekonać tmuxa (a raczej basha) do braku źródła /etc/profile(z jakiegoś powodu tmux zawsze działa jako powłoka logowania, co oznacza, że ​​/ etc / profil zostanie odczytany), ale możesz się upewnić, że efekty path_helper don wkręć swoją ŚCIEŻKĘ.

Sztuczka polega na upewnieniu się, że ŚCIEŻKA jest pusta przed uruchomieniem path_helper. W moim ~/.bash_profilepliku mam to:

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

Wyczyszczenie ŚCIEŻKI przed wykonaniem path_helper zapobiegnie przygotowaniu domyślnej ŚCIEŻKI do (poprzednio) ŚCIEŻKI i pozwoli pozostałym osobistym skryptom instalacyjnym bash (polecenia znajdujące się niżej .bash_profilelub w .bashrcprzypadku, gdy je pozyskałeś .bash_profile) na skonfigurowanie twojego ŚCIEŻKA odpowiednio.

Mam nadzieję, że to ma sens ...

Graham Ashton
źródło
1
To całkowicie zrobiło to dla mnie! Sam mam to za if [ -n "$TMUX" ]klauzulą, ale zastanawiałem się - jak ważne jest to [ -f /etc/profile ]naprawdę? Czy nie jest bezpiecznie zakładać, że /etc/profilezawsze jest to zwykły plik?
Ryan Lue
1
@RyanLue Można wygodnie wymienić -fz -e, ale nie osobiście spróbować źródło pliku ze skryptu, który pobiera prowadzonym kiedy się zalogować, chyba bym sprawdził to było. Jednak często używam skryptu bash na wielu różnych komputerach (i systemach operacyjnych), więc chcę się upewnić, że są one kuloodporne. Mogę sobie wyobrazić, że niektóre inne warianty unix mogą to nazwać czymś innym.
Graham Ashton,
DZIĘKUJĘ CI! Doprowadzało mnie to do szaleństwa i umieszczenie tego ~/.bash_profilekrótkiego fragmentu na szczycie mojego zdrowia psychicznego przywróciło mój szczęśliwy świat tmux.
hoosierEE
Jeśli nie chcą zadzierać z domyślnych ustawień systemu, set -g default-command "${SHELL}"w .tmux.confsiłach tmux używać pocisków bez logowania. I tak nie widzę sensu, ponieważ zwykle otwierasz tmux po zalogowaniu się.
seeker_of_bacon
5

Nie; sortowanie $PATHbyłoby zbyt szaloną rzeczą, ponieważ wiele systemów zależy od kolejności ustawionej przez użytkownika.

Jednak tmux ma uruchomić powłokę w trybie „login”, powodując ~/.profilebyć pozyskiwane ponownie . Oznacza to, że jeśli masz coś takiego PATH=/my/dir:/another/dir:$PATHw tym pliku, zostanie to zrobione ponownie , co spowoduje dodanie $ PATH /my/dir:/another/dir:/my/dir:/another/dir:(etc.). Aby tego uniknąć, możesz użyć innej zmiennej do sprawdzenia:

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

export PATH="/my/dir:/another/dir:$PATH"
użytkownik1686
źródło
0

@Graham Ashton Dzięki za pomysł

Moją sugestią byłoby, że umieściłeś

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

w pliku .zshrc u góry.

UPEWNIJ SIĘ, że twój

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

jest poniżej.

sunsoft
źródło