Официальное руководство по zsh рекомендует настроить переменную окружения PATH в zshenv:
http://zsh.sourceforge.net/Intro/intro_3.html
`.zshenv'
во всех вызовах оболочки, если не задана опция-f
. Он должен содержать команды для установки пути поиска команд, а также другие важные переменные среды.
`.zshenv'
не должен содержать команд, которые производят вывод или предполагают, что оболочка присоединена к tty.
По моему опыту, это на самом деле плохая идея, потому что многие утилиты манипулируют вашим PATH
в целях помещения вас в какую-то изолированную среду. Примеры этого очень распространенного паттерна включают в себя python virtualenv, nix-shell и другие. Если вы просто без разбора установите свой PATH в .zshenv
, вы уничтожите эти изменения и сломаете песочницу.
Чтобы обойти это, я установил переменную среды после настройки PATH, и проверяю, чтобы убедиться, что переменная среды не установлена перед выполнением настройки PATH
в zshenv.
Проблема с этим подходом состоит в том, что многие операционные системы явно устанавливают PATH
(игнорируя любое предыдущее значение) в нечто вроде /etc/profile
. Когда запускаются последующие оболочки, моя конфигурация избегает перенастройки PATH
потому что она уже настроена, но эти изменения были заблокированы тем, что находится в /etc/profile
.
В итоге: этот бизнес по настройке PATH
намного сложнее, чем можно было ожидать. Я чувствую, что на самом деле у меня есть достаточно четкое понимание того, как все работает, и все же, мне не совсем понятно, что такое "правильная вещь".
Я подозреваю, что существование оболочек 'login' и 'non-login' отчасти является попыткой решения этой проблемы, но затем проблема, но руководство zsh, кажется, очень ясно говорит о том, что PATH
должен быть настроен в .zshenv
, Мне кажется странным, что вам придется использовать механизм переменных среды, который я настроил, просто чтобы заставить что-то вроде virtualenv работать вообще.