Tmux «сортирует» переменную PATH?

14

У меня есть воспроизводимая проблема:

  1. настроить мой путь в Bash .profile
  2. запустите tmux tmux, tmux attachили любой другой вариант
  3. Отобразите $ PATH и просмотрите его с теми же компонентами, но в другом порядке.

Как это остановить? Чем это объясняется?

Robottinosino
источник

Ответы:

29

Если вы работаете на Mac и удивляетесь, почему /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/binпри запуске tmux все время добавляется к PATH, это из-за утилиты path_helper, которая запускается из вашего /etc/profileфайла.

Вы не можете легко убедить tmux (точнее, bash) не исходить /etc/profile(по какой-то причине tmux всегда запускается как оболочка входа в систему, что означает, что / etc / profile будет читаться), но вы можете убедиться, что эффекты path_helper don винт с вашей PATH.

Хитрость заключается в том, чтобы убедиться, что PATH пуст перед запуском path_helper. В моем ~/.bash_profileфайле у меня есть это:

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

Очистка PATH перед выполнением path_helper предотвратит добавление значения PATH по умолчанию к выбранному (ранее) выбранному PATH и позволит остальным вашим сценариям настройки bash (командам, расположенным ниже .bash_profileили в том .bashrcслучае, если вы их получили .bash_profile) настроить свои ПУТЬ соответственно.

Надеюсь, что это имеет смысл ...

Грэм Эштон
источник
1
Это полностью сделало это для меня! Я сам это спрятал за if [ -n "$TMUX" ]пунктом, но мне было интересно - насколько это важно на [ -f /etc/profile ]самом деле? Разве не безопасно предположить, что /etc/profileэто всегда обычный файл?
Райан Лю
1
@RyanLue Вы могли бы с комфортом заменить -fна -e, но я бы лично не пытался найти файл из сценария, который запускается при входе в систему, если я не проверил его там. Тем не менее, я склонен повторно использовать мой bash-скрипт на многих разных машинах (и в операционных системах), поэтому я хочу убедиться, что они пуленепробиваемые. Я могу представить, что некоторые другие варианты Unix могут назвать это как-то иначе.
Грэм Эштон,
СПАСИБО! Это сводило меня с ума, и помещение этого маленького фрагмента на вершину моего ~/.bash_profileвернуло здравомыслие в мой счастливый мир Tmux.
hoosierEE
Если вы не хотите возиться с системой по умолчанию, set -g default-command "${SHELL}"в .tmux.confсилах tmux использовать не для входа снарядов. В любом случае, я не вижу в этом смысла, поскольку вы обычно открываете tmux после того, как уже вошли в систему.
seeker_of_bacon
5

Нет; сортировка $PATHбыла бы слишком сумасшедшей вещью, поскольку многие системы зависят от ее пользовательского порядка.

Тем не менее, tmux запускает вашу оболочку в режиме «входа в систему», что приводит ~/.profileк повторному получению . Это означает, что если у вас есть что-то вроде PATH=/my/dir:/another/dir:$PATHэтого файла, это будет сделано снова , в результате чего будет содержаться $ PATH /my/dir:/another/dir:/my/dir:/another/dir:(etc.). Чтобы избежать этого, вы можете использовать другую переменную для проверки:

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

export PATH="/my/dir:/another/dir:$PATH"
user1686
источник
0

@ Грэхэм Эштон Спасибо за вашу идею

Мое предложение было бы, что вы положили

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

в вашем файле .zshrc вверху.

УБЕДИТЕСЬ, что ваш

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

ниже.

SunSoft
источник