↓Перейти к содержанию
  1. Git: руководства и команды/

Файл .zshenv: переменные окружения для разработчика

·4 минуты·

.zshenv — файл конфигурации Zsh, который загружается при каждом запуске оболочки, включая неинтерактивные и non-login сессии. Это лучшее место для переменных окружения, которые должны быть доступны везде — в терминале, в скриптах и в GUI-приложениях.

Что такое .zshenv #

Zsh при запуске читает несколько файлов конфигурации в определённом порядке:

Порядок загрузки (от первого к последнему):
1. /etc/zshenv        — системный (для всех пользователей)
2. ~/.zshenv          — пользовательский ← здесь переменные окружения
3. /etc/zprofile      — системный login-shell
4. ~/.zprofile        — пользовательский login-shell
5. /etc/zshrc         — системный интерактивный
6. ~/.zshrc           — пользовательский интерактивный
7. /etc/zlogin        — системный login-shell (финальный)
8. ~/.zlogin          — пользовательский login-shell (финальный)

.zshenv загружается всегда — это делает его идеальным местом для переменных окружения.

Отличие от .zshrc #

.zshenv:
- Загружается при каждом запуске Zsh (интерактивном и нет)
- Предназначен для переменных окружения (export VAR=value)
- Также загружается в скриптах и cron-задачах
- НЕ для псевдонимов и функций

.zshrc:
- Загружается только для интерактивных оболочек
- Для псевдонимов (alias), prompt, функций
- Для настройки plagers (oh-my-zsh, starship)
- НЕ загружается в скриптах

Правило: если переменная нужна в скриптах — в .zshenv. Если только в интерактивном терминале — в .zshrc.

Типичное содержимое .zshenv #

# ~/.zshenv

# PATH — основная переменная
export PATH="$HOME/.local/bin:$HOME/bin:$PATH"

# Homebrew (macOS)
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"

# Переменные для Git
export GIT_EDITOR="vim"           # редактор для коммитов
export GIT_AUTHOR_NAME="Иван Иванов"
export GIT_AUTHOR_EMAIL="[email protected]"

# Node.js
export NVM_DIR="$HOME/.nvm"
export NODE_PATH="$HOME/.nvm/versions/node/v20.0.0/lib/node_modules"

# Python
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

# Java
export JAVA_HOME="/usr/lib/jvm/java-17-openjdk"
export PATH="$JAVA_HOME/bin:$PATH"

# Общие переменные
export EDITOR="vim"
export VISUAL="code --wait"
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"

Переменные Git в .zshenv #

Git использует переменные окружения для настройки поведения:

# ~/.zshenv — переменные для Git

# Редактор сообщений коммитов
export GIT_EDITOR="vim"
# или VS Code:
export GIT_EDITOR="code --wait"
# или nano:
export GIT_EDITOR="nano"

# Альтернатива: через git config (приоритет выше env)
# git config --global core.editor "code --wait"

# Пейджер для вывода (git log, git diff)
export GIT_PAGER="less -FX"
# или отключить:
export GIT_PAGER=""

# SSH ключ для Git операций
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519_work"

# Цвет в выводе
export GIT_TERMINAL_PROMPT=1

# Для отладки (показывает curl запросы)
# export GIT_TRACE=1
# export GIT_CURL_VERBOSE=1

PATH для инструментов разработки #

# ~/.zshenv — добавление путей к инструментам

# Homebrew (macOS arm64)
export PATH="/opt/homebrew/bin:$PATH"

# nvm (Node.js version manager)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"

# rbenv (Ruby version manager)
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"

# Go
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"

# Rust (cargo)
export PATH="$HOME/.cargo/bin:$PATH"

# Пользовательские скрипты
export PATH="$HOME/scripts:$PATH"

Создание и редактирование .zshenv #

# Создать файл если нет
touch ~/.zshenv

# Открыть в редакторе
nano ~/.zshenv
# или
vim ~/.zshenv
# или
code ~/.zshenv

# Применить изменения немедленно (без перезапуска терминала)
source ~/.zshenv

# Проверить что переменная установлена
echo $GIT_EDITOR
echo $PATH

Проверка и отладка #

# Показать все переменные окружения
env | sort

# Найти конкретную переменную
env | grep GIT

# Проверить где определена переменная
echo $PATH
which git
which node

# Трассировка загрузки Zsh (отладка)
zsh -xvls 2>&1 | head -50

# Проверить что .zshenv загружается в скриптах
zsh -c 'echo $GIT_EDITOR'  # должен показать значение
bash -c 'echo $GIT_EDITOR' # bash не читает .zshenv

Работа на macOS #

На macOS переменные окружения для GUI-приложений (VS Code, Finder) нужно устанавливать иначе:

# ~/.zshenv читается только терминальными приложениями
# Для GUI-приложений на macOS:

# Способ 1: launchctl (устаревший, но работает)
launchctl setenv GIT_EDITOR vim

# Способ 2: ~/.config/environment.plist
# (специфично для macOS)

# На практике: VS Code и JetBrains читают PATH из терминала
# если запущены из терминала:
code .           # запуск из терминала — унаследует PATH
open -a "VS Code" . # запуск из Finder — может не унаследовать

Часто задаваемые вопросы #

Почему PATH не работает в GUI-приложениях? GUI-приложения на macOS не запускают login shell, поэтому .zshenv и .zshrc не читаются. Решение: запускать IDE из терминала (code .).

Что делать если в .zshenv ошибка? Zsh не запустится. Исправить через другую оболочку: bash ~/.zshenv покажет ошибку. Или открыть файл через Finder/другой редактор.

Можно ли хранить секреты в .zshenv? Нежелательно — файл хранится в открытом виде. Для API ключей лучше использовать менеджер секретов (1Password CLI, Vault) или .env файлы (не попадающие в Git).

Что приоритетнее: .zshenv или git config? Git-специфичные переменные (GIT_EDITOR) в git config имеют приоритет над переменными окружения. Для PATH и системных переменных — только .zshenv работает.

Как проверить что .zshenv загружается? Добавьте echo ".zshenv loaded" в файл и откройте новый терминал. Если видите сообщение — файл загружается.

Заключение #

.zshenv — правильное место для переменных окружения (PATH, GIT_EDITOR, JAVA_HOME) в Zsh. В отличие от .zshrc, загружается при любом запуске оболочки — в интерактивных сессиях, скриптах и cron-задачах. Изменения применяются после source ~/.zshenv. Для настройки Git редактора используйте GIT_EDITOR в .zshenv или git config --global core.editor. Подробнее о настройке Git — настройка Git.