Настройка zsh: .zshrc, prompt, плагины

Рейтинг: 52.3% · 11 голосов
Подробный курс по macOS для разработчиков и админов: архитектура и Apple Silicon, терминал и zsh, Homebrew и пакеты, launchd и автоматизация, APFS и Time Machine, безопасность (SIP, Gatekeeper, TCC, FileVault), сеть, логи и диагностика, MDM и DDM, контейнеры и виртуализация, восстановление. По официальной документации Apple, актуально на 2026 (macOS 26 Tahoe).
Ответить
Аватара пользователя
Artem_MacAdmin
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Настройка zsh: .zshrc, prompt, плагины

Сообщение Artem_MacAdmin »

Оглавление курса (47)
  1. Что такое macOS: Unix под капотом и место в 2026
  2. Архитектура macOS: XNU, тома и Signed System Volume
  3. Apple Silicon: ARM, Rosetta 2 и отличия от Intel
  4. Установка, обновление и восстановление macOS
  5. Finder, рабочий стол и продуктивность
  6. Системные настройки и их управление из CLI (defaults)
  7. Пользователи и группы: учётные записи и управление
  8. Терминал и zsh: командная строка macOS
  9. CLI на macOS: BSD-команды и отличия от Linux
  10. Настройка zsh: .zshrc, prompt, плагины (вы здесь)
  11. Файловая система и права: POSIX, ACL, атрибуты, флаги
  12. Homebrew: пакетный менеджер для macOS
  13. Homebrew глубже: tap, Brewfile, services, обслуживание
  14. Другие пакеты: MacPorts, mas, Nix и App Store
  15. Установка приложений: .app, .dmg, .pkg и Gatekeeper
  16. Управление приложениями и их данные
  17. launchd и launchctl: система запуска macOS
  18. Свои службы и периодические задачи на launchd
  19. Автоматизация: Shortcuts, AppleScript и osascript
  20. Конфигурация как код: defaults, plist и профили
  21. APFS: снапшоты, клоны, контейнеры и шифрование
  22. Управление дисками: diskutil, образы и форматирование
  23. Time Machine и резервное копирование
  24. Внешние диски, форматы и сетевые тома
  25. Модель безопасности macOS: SIP и целостность системы
  26. Gatekeeper, нотаризация и защита от вредоносов
  27. Приватность и TCC: разрешения на доступ
  28. FileVault: полнодисковое шифрование
  29. Связка ключей и управление секретами
  30. Сетевой экран и защита сети
  31. Сеть в macOS: настройка и инструменты
  32. Диагностика сети на Mac
  33. Общий доступ: SSH, экран, файлы, удалённое управление
  34. Процессы и ресурсы: мониторинг производительности
  35. Логи macOS: unified logging и диагностика
  36. Производительность и энергия: powermetrics, диагностика
  37. Энергия, сон и обслуживание системы
  38. Профили конфигурации и основы MDM
  39. Управление парком Mac: MDM, DDM и zero-touch (2026)
  40. Среда разработчика на Mac: Xcode CLT, git, версии
  41. Контейнеры на Mac: Docker Desktop, OrbStack, Apple container
  42. Виртуализация: Virtualization.framework, UTM, Linux и Windows
  43. Режимы загрузки и восстановление (Apple Silicon)
  44. Сброс, NVRAM, Safe Mode и сброс настроек
  45. Траблшутинг macOS: дерево решений по симптомам
  46. Место на диске и обслуживание системы
  47. Сквозной проект: настройка Mac как у профи + куда расти
Зачем вообще лезть в конфиг zsh

Открыл терминал на свежем Mac - и вот он, голый zsh. Скучный prompt "user@MacBook ~ %", никакого автодополнения по делу, история теряется между сессиями, а после установки Homebrew половина команд "command not found". Знакомо? Начиная с macOS Catalina zsh - оболочка по умолчанию вместо bash, и Apple больше его не двигает в сторону. Значит, разбираться надо именно с ним. Хорошая новость: zsh из коробки мощнее bash, и грамотная настройка терминала Mac превращает его из печатной машинки в рабочий инструмент - с подсказками, подсветкой, нормальной историей и осмысленным prompt.

Но прежде чем копировать чужой zshrc с гитхаба, надо понять механику: какой файл когда читается. Девять из десяти проблем с PATH, дублирующимися алиасами и тормозами при старте - это непонимание порядка загрузки. Разберём так, чтобы ты потом не гадал, почему "оно опять сломалось".

Изображение

Файлы zsh и порядок их загрузки

У zsh пять стартовых файлов в твоём домашнем каталоге, и читаются они не все сразу, а в зависимости от типа сессии. Тип определяется двумя независимыми флагами: login (вход в систему, ssh, или явный запуск как login shell) и interactive (есть человек за клавиатурой). Полный порядок для каждой сессии такой:
  • ~/.zshenv - читается ВСЕГДА, при любом запуске zsh (даже когда скрипт дёргает оболочку неинтерактивно). Сюда кладут только переменные окружения, которые нужны абсолютно везде.
  • ~/.zprofile - только в login-сессии, до .zshrc. Аналог .zlogin, но раньше. Сюда логично класть инициализацию PATH.
  • ~/.zshrc - только в интерактивной сессии. Главный рабочий файл: алиасы, функции, опции, prompt, плагины, история.
  • ~/.zlogin - только в login-сессии, после .zshrc. Для команд, что должны идти последними при логине.
  • ~/.zlogout - при выходе из login-сессии.
Перед каждым пользовательским файлом zsh читает системный аналог из /etc (/etc/zshenv, /etc/zprofile и т.д.). На macOS в /etc/zprofile сидит важная штука - вызов /usr/libexec/path_helper, который собирает PATH из /etc/paths и /etc/paths.d. Запомни это, к граблям с PATH ещё вернёмся.

Ключевой момент для macOS: Terminal.app и iTerm2 по умолчанию запускают КАЖДУЮ новую вкладку как login + interactive shell. Это особенность macOS - на Linux обычно наоборот. Поэтому у тебя при каждой вкладке читаются и .zprofile, и .zshrc. Проверь сам, чем является текущая сессия:

Код: Выделить всё

$ [[ -o login ]] && echo "login" || echo "non-login"
login
$ [[ -o interactive ]] && echo "interactive" || echo "non-interactive"
interactive
Видишь "login" - значит .zprofile в этой сессии отработал. А вот когда ты запускаешь скрипт через

Код: Выделить всё

zsh ./script.sh
или из cron-подобной службы launchd - сессия будет non-login non-interactive, и прочитается ТОЛЬКО .zshenv. Отсюда правило: переменные, без которых не живут даже фоновые скрипты, идут в .zshenv; всё для глаз человека - в .zshrc.

Где должен лежать PATH и почему Homebrew именно в .zprofile

Это место, где спотыкаются все. На Apple Silicon (M-серия) Homebrew ставится в /opt/homebrew - не в /usr/local, как было на Intel. Установщик в конце пишет тебе подсказку, и официальный способ подцепить brew в shell такой:

Код: Выделить всё

echo >> ~/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
Команда

Код: Выделить всё

brew shellenv
- это не магия, она просто печатает набор export. Посмотри, что именно она добавляет:

Код: Выделить всё

$ /opt/homebrew/bin/brew shellenv
export HOMEBREW_PREFIX="/opt/homebrew";
export HOMEBREW_CELLAR="/opt/homebrew/Cellar";
export HOMEBREW_REPOSITORY="/opt/homebrew";
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}";
export MANPATH="/opt/homebrew/share/man${MANPATH+:$MANPATH}:";
export INFOPATH="/opt/homebrew/share/info:${INFOPATH:-}";
Главное здесь - что

Код: Выделить всё

/opt/homebrew/bin
дописывается В НАЧАЛО PATH. Поэтому brew-версия git, python и прочего перебивает системную. И вот почему именно zprofile, а не zshrc: на macOS системный /etc/zprofile через path_helper уже один раз пересобрал PATH. Если ты сунешь brew shellenv в .zshrc (которая читается ПОСЛЕ .zprofile), порядок будет правильным. Но если положишь в .zshenv (читается ДО /etc/zprofile), path_helper потом всё перетасует и закинет /usr/bin вперёд твоего /opt/homebrew. Результат - у тебя "правильный" PATH в неинтерактивной сессии и "сломанный" в обычном терминале, или наоборот. Поэтому официальная рекомендация Apple+Homebrew - .zprofile. Это login-файл, отрабатывает после системного path_helper, и порядок выходит предсказуемым.

Проверка, кто победил в гонке за PATH:

Код: Выделить всё

$ which -a python3
/opt/homebrew/bin/python3
/usr/bin/python3
$ echo $PATH | tr ':' '\n' | head -3
/opt/homebrew/bin
/opt/homebrew/sbin
/usr/local/bin
Если /opt/homebrew не в начале - смотри, не дублируешь ли ты shellenv в нескольких файлах и не сбивает ли порядок какой-нибудь чужой dotfile.

Кастомизация .zshrc: prompt, история, автодополнение

Теперь основное мясо - zsh конфиг в ~/.zshrc. Начнём с prompt. В zsh за него отвечают переменные PROMPT (он же PS1, левая часть) и RPROMPT (правая, прижата к краю окна). Внутри - проценто-escape-последовательности: имя пользователя, хост, текущий каталог с сокращением домашнего до тильды, # для root и % для обычного. Цвет задаётся через /. Минимальный осмысленный prompt:

Код: Выделить всё

PROMPT='%F{cyan}%n%f@%F{green}%m%f %F{yellow}%~%f %# '
Получишь что-то вроде "ivan@MacBook ~/Projects % " с подсветкой. В RPROMPT часто выводят время или ветку git. Покажу заодно живой пример с git-веткой через vcs_info (встроенный модуль zsh, не требует плагинов):

Код: Выделить всё

autoload -Uz vcs_info
precmd() { vcs_info }
zstyle ':vcs_info:git:*' formats '%F{magenta}(%b)%f'
setopt prompt_subst
RPROMPT='${vcs_info_msg_0_}'
prompt_subst критичен: без него подстановка внутри prompt не сработает, и ты увидишь голую строку с долларом. Это частая ошибка.

История. По умолчанию macOS пишет в ~/.zsh_history, но размер и поведение надо настроить руками, иначе теряешь команды:

Код: Выделить всё

HISTFILE=~/.zsh_history
HISTSIZE=50000
SAVEHIST=50000
setopt INC_APPEND_HISTORY    # писать сразу, не при выходе
setopt SHARE_HISTORY         # общая история между вкладками
setopt HIST_IGNORE_ALL_DUPS  # выкидывать старые дубли
setopt HIST_IGNORE_SPACE     # команда с пробелом в начале не пишется
setopt HIST_REDUCE_BLANKS    # схлопывать лишние пробелы
HISTSIZE - сколько держится в памяти сессии, SAVEHIST - сколько пишется в файл. Они независимы, ставь оба. SHARE_HISTORY делает так, что команда из одной вкладки тут же доступна стрелкой вверх в другой - после привычки к bash это меняет жизнь.

Автодополнение. zsh-овский compsys - отдельная вселенная, но включается одной парой строк:

Код: Выделить всё

autoload -Uz compinit && compinit
zstyle ':completion:*' menu select        # навигация стрелками по меню
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'  # регистронезависимо

Код: Выделить всё

compinit
при первом запуске сканирует $fpath, собирает базу дополнений и кеширует в ~/.zcompdump. Если поставил пакет brew, который кладёт completions (например

Код: Выделить всё

brew install zsh-completions
), нужно добавить его путь в fpath ДО compinit:

Код: Выделить всё

if type brew &>/dev/null; then
  FPATH="$(brew --prefix)/share/zsh-completions:$FPATH"
fi
autoload -Uz compinit && compinit
Алиасы, функции и плагины, которые реально нужны

Алиас - простая замена слова, функция - когда нужны аргументы и логика. Не путай:

Код: Выделить всё

alias ll='ls -lhG'        # -G это цвет в BSD ls, НЕ как в GNU (там --color)
alias gs='git status -sb'
alias ..='cd ..'

# функция: создать каталог и сразу зайти
mkcd() { mkdir -p "$1" && cd "$1"; }
Обрати внимание на ls -G: macOS - это BSD, не GNU/Linux. Флаг цвета здесь -G, а не --color; sed требует

Код: Выделить всё

sed -i ''
с пустым аргументом; find и xargs тоже отличаются. Если хочешь GNU-инструменты - ставь

Код: Выделить всё

brew install coreutils gnu-sed
, они идут с префиксом g (gls, gsed) либо подключаются через gnubin в PATH.

Два плагина, которые ставят почти все, и не зря:
  • zsh-autosuggestions - дорисовывает серым продолжение команды из истории, принимаешь стрелкой вправо.
  • zsh-syntax-highlighting - подсвечивает команду на лету: зелёным если бинарь найден, красным если опечатка. Видишь ошибку ДО Enter.
Ставим через Homebrew и подключаем в .zshrc:

Код: Выделить всё

brew install zsh-autosuggestions zsh-syntax-highlighting

Код: Выделить всё

source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
# syntax-highlighting ОБЯЗАТЕЛЬНО последней строкой .zshrc
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
Порядок важен: syntax-highlighting перехватывает ввод и должен подключаться в самом конце файла, иначе подсветка ломается или не видит твои алиасы.

Фреймворки: oh my zsh, Prezto, starship, zinit

Можно собирать конфиг руками, а можно взять фреймворк. Самый известный - oh my zsh (он же oh-my-zsh, OMZ). Это менеджер плагинов и тем с огромной библиотекой. Ставится скриптом:

Код: Выделить всё

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Грабля номер один: установщик перезаписывает твой ~/.zshrc, сделав бэкап в ~/.zshrc.pre-oh-my-zsh. После установки твои старые алиасы и brew shellenv надо вернуть. Управление - через переменные в .zshrc: тема ZSH_THEME (по умолчанию "robbyrussell") и список plugins=(...). Те же autosuggestions и highlighting в OMZ подключают как плагины, а не через source.

Плюс OMZ - быстрый старт и тонна готового. Минус - может заметно тормозить запуск shell (десятки плагинов = сотни миллисекунд на каждую вкладку). Альтернативы:
  • Prezto - легче и быстрее OMZ, модульный, но менее популярен и хуже документирован.
  • zinit - менеджер плагинов с ленивой загрузкой и turbo-режимом: грузит плагины асинхронно после показа prompt, старт почти мгновенный. Для тех, кому важна скорость и много плагинов.
  • starship - это НЕ фреймворк, а только prompt, написанный на Rust, кросс-шелловый и очень быстрый. Ставится

    Код: Выделить всё

    brew install starship
    и подключается одной строкой в КОНЕЦ .zshrc:

Код: Выделить всё

eval "$(starship init zsh)"
Настраивается starship отдельным файлом ~/.config/starship.toml, и при этом совместим с любыми плагинами zsh - то есть можно взять голый zsh + starship для prompt + два плагина выше, и получить быстрый красивый сетап без тяжёлого фреймворка. Многие профи именно так и делают в 2026: меньше магии, быстрее старт, всё под контролем.

Dotfiles в git: чтобы не настраивать заново

Один раз вылизал конфиг - не теряй его. Заведи репозиторий dotfiles. Простейший подход - папка ~/dotfiles с файлами и симлинками:

Код: Выделить всё

mkdir ~/dotfiles && mv ~/.zshrc ~/dotfiles/zshrc
ln -s ~/dotfiles/zshrc ~/.zshrc
cd ~/dotfiles && git init && git add . && git commit -m "init dotfiles"
На новой машине: клонируешь репо, прогоняешь скрипт с ln -s - и твой zsh такой же, как был. Не клади в публичный репо .zsh_history и ничего с токенами/ключами - секреты выноси в отдельный незакоммиченный файл и подключай через

Код: Выделить всё

[[ -f ~/.secrets ]] && source ~/.secrets
.

Типичные грабли
  • brew shellenv в .zshenv - PATH ломается после path_helper. Только .zprofile.
  • syntax-highlighting не в конце файла - подсветка не видит алиасы или вовсе не работает.
  • Забыл setopt prompt_subst - в prompt вместо ветки git голый текст с долларом.
  • OMZ затёр .zshrc - ищи бэкап в ~/.zshrc.pre-oh-my-zsh, верни своё.
  • Тяжёлый старт - замерь причину:

    Код: Выделить всё

    time zsh -i -c exit
    . Если больше 0.3-0.4 с, виноваты плагины или compinit без кеша.
  • Правки не применились - после редактирования сделай

    Код: Выделить всё

    source ~/.zshrc
    или открой новую вкладку. Старые сессии конфиг сами не перечитывают.
  • compinit ругается на insecure directories - у каталога в fpath слишком открытые права. Чинится

    Код: Выделить всё

    chmod -R go-w "$(brew --prefix)/share"
    .
Мини-лаба: собери конфиг руками
  • Определи тип текущей сессии:

    Код: Выделить всё

    [[ -o login ]] && echo login
    и то же для interactive.
  • Посмотри сырой вывод

    Код: Выделить всё

    /opt/homebrew/bin/brew shellenv
    и убедись, что эта строка есть в ~/.zprofile (а не в .zshrc/.zshenv).
  • В ~/.zshrc настрой PROMPT с подсветкой и блок истории с SHARE_HISTORY и HIST_IGNORE_ALL_DUPS. Открой две вкладки, выполни команду в одной - проверь стрелкой вверх в другой.
  • Поставь

    Код: Выделить всё

    brew install zsh-autosuggestions zsh-syntax-highlighting
    , подключи source-ами (highlighting - последней строкой). Набери

    Код: Выделить всё

    gti status
    и убедись, что подсветка стала красной.
  • Замерь старт:

    Код: Выделить всё

    time zsh -i -c exit
    . Запиши число. Потом, если поставишь starship или OMZ - сравни.
  • Заверни ~/.zshrc и ~/.zprofile в git-репозиторий dotfiles через симлинки.
Контрольные вопросы
  • Какой единственный стартовый файл zsh читается при запуске неинтерактивного скрипта из launchd, и что из-за этого нельзя класть в .zshrc?
  • Почему

    Код: Выделить всё

    eval "$(brew shellenv)"
    кладут в .zprofile, а не в .zshenv? Что делает path_helper и как он связан с порядком PATH?
  • Зачем zsh-syntax-highlighting подключать последней строкой .zshrc, и что сломается, если этого не сделать?
  • Чем алиас отличается от функции, и почему на macOS работает, а

    Код: Выделить всё

    ls --color
    - нет?
Итог

zsh на macOS - это пять стартовых файлов с чётким порядком: .zshenv везде, .zprofile в login (сюда PATH и brew shellenv), .zshrc для интерактива (prompt, история, алиасы, плагины). Поняв этот порядок, ты перестаёшь воевать с PATH и Homebrew. Дальше дело техники: PROMPT/RPROMPT, нормальная история с дедупом, compinit, два плагина-подсказчика, и по вкусу - starship или oh my zsh. Всё это вынеси в git-dotfiles и переноси между машинами одной командой. Голый терминал превращается в инструмент, который работает на тебя.
👍3 ❤️2 🔥 😄 🤔
Аватара пользователя
konradi
Сообщения: 1
Зарегистрирован: 14 май 2026, 22:09

Re: Настройка zsh: .zshrc, prompt, плагины

Сообщение konradi »

Спасибо, наконец дошло почему brew shellenv именно в zprofile. Сунул его в zshenv месяц назад и потом ловил рандомный PATH в скриптах, мучился. Перенес - все ровно стало.
👍 ❤️ 🔥1 😄 🤔
Аватара пользователя
fpga99
Сообщения: 1
Зарегистрирован: 11 май 2026, 22:18

Re: Настройка zsh: .zshrc, prompt, плагины

Сообщение fpga99 »

А starship реально быстрее oh my zsh? У меня OMZ с десятком плагинов вкладка открывается с ощутимой задержкой. Сделал time zsh -i -c exit - 0.6 секунды, многовато походу. Попробую голый zsh + starship + два плагина из урока.
👍 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
CLI на macOS: BSD-команды и отличия от Linux
Следующая глава →
Файловая система и права: POSIX, ACL, атрибуты, флаги

Все главы курса «macOS для профи: администрирование, терминал и Homebrew»

Поделиться темой: ✈ Telegram VK
Похожие запросы: Терминал и команды macOSНастройка zsh на Mac

Вернуться в «macOS для профи: администрирование, терминал и Homebrew»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя