Инструкции

Как настроить терминал на Mac: Oh My Zsh с готовым конфигом

Как настроить терминал на Mac: Oh My Zsh с готовым конфигом

Как настроить терминал на Mac: Oh My Zsh с готовым конфигом

Когда вы впервые открываете терминал на Mac, он выглядит... скучно. Чёрный фон, белые буквы, никаких подсказок, никаких цветов. Каждая команда - в слепую. Опечатался - получил «command not found». Хочешь повторить вчерашнюю команду - листай стрелочкой вверх по одной.

Этот гайд за один присест превратит ваш терминал в инструмент, в котором приятно работать:

  • подсказки по мере набора (серым цветом из вашей истории)
  • подсветка синтаксиса (опечатки видно сразу)
  • умное автодополнение по Tab (не нужно помнить точные имена)
  • встроенные шпаргалки на русском (cheat basic, cheat git)
  • безопасные команды (rm переспросит, не удалит молча)
  • готовый конфиг для копи-паста с подробными комментариями

Что нужно: Mac (Apple Silicon или Intel - всё равно), 30-40 минут времени и желание разобраться. Опыт работы в терминале не требуется - объясню от самого начала.

Содержание

  1. Что такое терминал и зачем его настраивать
  2. Как открыть терминал на Mac
  3. Что такое Zsh, Oh My Zsh и плагины
  4. Шаг 1: устанавливаем Homebrew
  5. Шаг 2: устанавливаем Oh My Zsh
  6. Шаг 3: устанавливаем дополнительные утилиты
  7. Шаг 4: находим файл .zshrc (включая показ скрытых файлов)
  8. Шаг 5: открываем файл для редактирования
  9. Шаг 6: вставляем готовый конфиг
  10. Шаг 7: применяем настройки
  11. Powerlevel10k - проходим визард (если выбрали эту тему)
  12. Что вы получили: разбор по разделам
  13. 25 базовых команд, которые надо знать
  14. Что делать, если что-то пошло не так
  15. Безопасность в командной строке
  16. Куда двигаться дальше

1. Что такое терминал и зачем его настраивать

Терминал - это программа, которая позволяет управлять компьютером текстовыми командами вместо мыши и кликов. На macOS она называется Terminal.app и лежит в Applications → Utilities.

Зачем он нужен обычному пользователю Mac? Ну вот примеры:

  • Установить программу одной командой вместо «скачать DMG → перетащить в Applications»
  • Массово переименовать сотню файлов
  • Подключиться к серверу или работать с GitHub
  • Сжать 5000 фотографий в один формат
  • Найти, что съело 50 ГБ диска
  • Запустить локальный веб-сервер для теста сайта

Дефолтный терминал в macOS работает на оболочке Zsh (с macOS Catalina 2019 года). Оболочка - это программа, которая принимает ваши команды и запускает их. По умолчанию Zsh настроен очень аскетично: чёрный фон, белые буквы и больше ничего.

Хорошая новость: Zsh - самая мощная и настраиваемая оболочка в мире Unix-подобных систем. Вокруг неё построена огромная экосистема плагинов, тем и инструментов, которые мы и установим.

2. Как открыть терминал на Mac

Три способа - выбирайте удобный:

Способ 1: Spotlight (самый быстрый)

Нажмите Cmd + Пробел, начните вводить «Terminal» (или «Терминал», если у вас русский интерфейс). Когда увидите иконку - нажмите Enter.

Способ 2: Launchpad

Откройте Launchpad (иконка с ракетой в Dock или жест на трекпаде - сжать четыре пальца). Найдите папку «Other» / «Другое» - там лежит Terminal.

Способ 3: Finder

Откройте Finder → в меню сверху Go → Utilities (Cmd+Shift+U) → Terminal.

Откроется окно с черно-белым фоном и приглашением вида:

yourname@MacBook-Pro ~ %

Это и есть командная строка. Знак % означает: «жду команду». Сюда мы будем писать.

Совет: чтобы открывать терминал ещё быстрее, перетащите его иконку в Dock из Launchpad - правый клик по иконке → Options → Keep in Dock.

3. Что такое Zsh, Oh My Zsh и плагины - простыми словами

Прежде чем начать, давайте уберём путаницу:

  • Терминал (Terminal.app) - это окно. Оно само по себе ничего не делает.
  • Zsh - это программа-оболочка, которая работает внутри окна терминала и принимает команды.
  • Oh My Zsh - это надстройка над Zsh. Это набор готовых конфигураций, плагинов и тем, который превращает Zsh из «голого» в дружелюбный.
  • Плагин - кусочек кода, добавляющий новую функциональность. Например, плагин git добавляет короткие команды (gst вместо git status).
  • Тема - визуальное оформление промпта (той строки, где вы пишете команды).

Аналогия: Zsh - это Word. Oh My Zsh - это надстройки и темы для Word. Вы можете писать в чистом Word, но удобнее с темами.

4. Шаг 1: устанавливаем Homebrew

Homebrew - менеджер пакетов для macOS. Через него ставится 99% полезных терминальных утилит одной командой brew install <имя>. Без Homebrew жить можно, но больно.

Откройте терминал и вставьте эту команду (Cmd+V):

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Нажмите Enter. Установщик попросит:

  1. Пароль вашего Mac - это нормально, нужен для системных папок. Когда вводите пароль - букв не видно (даже точек не видно, шелл показывает пустоту), это особенность Unix. Просто пишите и жмите Enter.
  2. Подтверждение установки - нажмите Enter ещё раз.

Установка займёт 5-10 минут. В конце выведет инструкцию вида:

==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo >> /Users/yourname/.zprofile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/yourname/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"

Скопируйте и запустите эти три команды - они «подскажут» терминалу, где искать brew. После этого проверьте, что всё работает:

brew --version

Если вывело что-то вроде Homebrew 4.x.x - всё хорошо.

Если у вас Mac с процессором Intel (а не Apple Silicon), Homebrew установится в /usr/local/, а не /opt/homebrew/. Пути в инструкциях установщика подстроятся автоматически.

5. Шаг 2: устанавливаем Oh My Zsh

Снова в терминал, вставляем:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Установщик за вас:
- Скачает Oh My Zsh в скрытую папку ~/.oh-my-zsh
- Сохранит ваш текущий .zshrc (если он был) как .zshrc.pre-oh-my-zsh - это резервная копия
- Создаст новый .zshrc с базовыми настройками
- Спросит: «Do you want to change your default shell to zsh?» - отвечайте Y и Enter

После установки терминал сразу обновится. Промпт станет цветным - например, ➜ ~. Это работает дефолтная тема Oh My Zsh - robbyrussell.

Поздравляю, у вас уже стало лучше. Но мы только начали.

6. Шаг 3: устанавливаем дополнительные утилиты

Чтобы готовый конфиг работал в полную силу, поставьте эти 5 утилит одной командой:

brew install eza bat zoxide fzf tldr

Что они делают:

  • eza - современная замена ls с цветами и иконками. Покажет, какие файлы git модифицированы, какие новые
  • bat - cat с подсветкой синтаксиса. Откроете JSON или HTML - увидите красиво
  • zoxide - умный cd, который запоминает посещённые папки. Один раз зашли в ~/Documents/projects/site - потом просто cd site и вы там
  • fzf - fuzzy-поиск. Привязывает горячие клавиши: Ctrl+R для истории команд, Ctrl+T для файлов
  • tldr - быстрая справка по командам с примерами. Вместо 500 строк man tar - 7 типичных примеров через tldr tar

После установки fzf запустите его настройщик - он добавит горячие клавиши:

$(brew --prefix)/opt/fzf/install --all

Опционально (но очень рекомендую) поставить ещё:

brew install htop ncdu tree jq wget rsync ripgrep fd
  • htop - красивый монитор процессов
  • ncdu - интерактивный анализ занимаемого места на диске
  • tree - вывод структуры папок в виде дерева
  • jq - парсинг и форматирование JSON
  • wget - альтернатива curl для скачивания
  • rsync - умное копирование с прогрессом и докачкой
  • ripgrep (команда rg) - поиск по тексту в файлах в десятки раз быстрее grep
  • fd - простой и быстрый аналог find

7. Шаг 4: находим файл .zshrc

Вот тут многие новички спотыкаются. Файл настроек называется .zshrc и лежит в вашей домашней папке. Но в Finder его не видно.

Что такое скрытые файлы

В macOS файлы и папки, имя которых начинается с точки, считаются скрытыми и не отображаются в Finder. Это так называемые dotfiles - файлы конфигурации различных программ. Идея простая: чтобы новички случайно не удалили или не сломали важные файлы, они спрятаны.

Файл .zshrc (с точкой в начале) - именно такой. Он лежит здесь:

/Users/ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ/.zshrc

Или, что то же самое:

~/.zshrc

Знак ~ (тильда) в Unix означает «домашняя папка текущего пользователя».

Как показать скрытые файлы в Finder

Откройте Finder (можно прямо щёлкнуть по пустому месту на рабочем столе). Перейдите в свою домашнюю папку: Cmd + Shift + H (от слова Home).

Теперь нажмите Cmd + Shift + . (Cmd + Shift + точка).

Что произойдёт: все скрытые файлы и папки станут видимыми. Они будут чуть прозрачнее обычных, чтобы вы могли отличить. Среди них найдёте .zshrc.

Та же комбинация Cmd + Shift + . скрывает их обратно. Запомните - очень полезный шорткат.

Почему файл .zshrc мог не появиться

Если вы только что установили Oh My Zsh, файл .zshrc точно есть. Но если установка ещё не дошла до него (например, не отвечали Y на смену оболочки), его может не быть. Тогда создайте его пустым:

touch ~/.zshrc

8. Шаг 5: открываем файл для редактирования

Способов несколько - выбирайте удобный.

Способ 1: TextEdit (самый простой для новичка)

В терминале:

open -e ~/.zshrc

Откроется в стандартном TextEdit как обычный текст. Можно редактировать, выделять, копировать-вставлять.

Способ 2: nano прямо в терминале

nano ~/.zshrc

nano - простой текстовый редактор внутри терминала. Управление - снизу подсказки. Главное:

  • Ctrl + O - сохранить (потом Enter подтвердить имя)
  • Ctrl + X - выйти
  • Ctrl + W - найти текст
  • Ctrl + K - вырезать строку

Способ 3: Visual Studio Code (если установлен)

code ~/.zshrc

Если code ругается «command not found» - значит, в VS Code не установлен shell-launcher. Откройте VS Code, нажмите Cmd + Shift + P, начните вводить «Shell Command: Install code», выберите эту опцию. Потом снова попробуйте.

Способ 4: двойной клик в Finder

После Cmd+Shift+. найдите .zshrc в домашней папке → двойной клик → откроется в TextEdit.

Все четыре способа открывают один и тот же файл. Изменения, сделанные через любой из них, будут видны и в остальных.

Очищаем содержимое

Если у вас в .zshrc уже что-то есть (после установки Oh My Zsh там будет дефолтная заготовка с кучей закомментированных опций), выделите всё (Cmd + A) и удалите (Backspace или Delete). Сохраним готовый бэкап на всякий случай:

cp ~/.zshrc ~/.zshrc.backup-$(date +%Y%m%d)

Эта команда создаст копию вида .zshrc.backup-20260426. Если что-то пойдёт не так - вернёмся к ней.

9. Шаг 6: вставляем готовый конфиг

Скопируйте код ниже целиком (это полная версия .zshrc). Затем вставьте в редактор (Cmd + V) на место удалённого содержимого.

Полный конфиг ~/.zshrc - 638 строк. Окно ниже прокручивается, чтобы не занимать много места. Внутри окна работает копирование (выделение + Cmd+C).
# ╔══════════════════════════════════════════════════════════════════════╗
# ║                                                                      ║
# ║   ~/.zshrc - дружелюбный конфиг для macOS                            ║
# ║   Что внутри:                                                        ║
# ║     - Тема jonathan (минималистичная встроенная OMZ)                 ║
# ║     - Плагины Oh My Zsh + zsh-autosuggestions + fast-syntax-highlight║
# ║     - Большая история, общая между терминалами                       ║
# ║     - Безопасные rm / cp / mv (переспрашивают)                       ║
# ║     - Полезные алиасы и функции                                      ║
# ║     - Поддержка eza / bat / zoxide / fzf если установлены            ║
# ║                                                                      ║
# ║   Не забудь установить (один раз):                                   ║
# ║     brew install eza bat zoxide fzf                                  ║
# ║     $(brew --prefix)/opt/fzf/install --all                           ║
# ║                                                                      ║
# ╚══════════════════════════════════════════════════════════════════════╝


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 1. PATH - дополнительные пути для исполняемых файлов                 │
# └──────────────────────────────────────────────────────────────────────┘
# Раскомментируй, если у тебя свои скрипты в ~/bin или ~/.local/bin
# export PATH="$HOME/bin:$HOME/.local/bin:$PATH"

# Homebrew подгружает свой PATH сам. На Apple Silicon путь /opt/homebrew/bin,
# на Intel - /usr/local/bin. Если brew команда не находится, раскомментируй:
# eval "$(/opt/homebrew/bin/brew shellenv)"


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 2. Окружение (язык, редактор)                                        │
# └──────────────────────────────────────────────────────────────────────┘
export LANG=en_US.UTF-8
export EDITOR='nano'                # nano - простой и понятный новичку
                                    # позже можно поменять на 'vim' или 'code -w'


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 3. Oh My Zsh                                                         │
# └──────────────────────────────────────────────────────────────────────┘
export ZSH="$HOME/.oh-my-zsh"

# ─── Тема промпта ─────────────────────────────────────────────────────
# jonathan - минималистичная встроенная тема OMZ
ZSH_THEME="jonathan"

# Альтернативы (раскомментируй одну, текущую закомментируй):
# ZSH_THEME="powerlevel10k/powerlevel10k"   # информативная, нужен визард p10k configure
# ZSH_THEME="agnoster"                       # сегментированная (нужен Nerd Font)
# ZSH_THEME="robbyrussell"                   # дефолтная OMZ

# ─── Поведение OMZ ────────────────────────────────────────────────────
zstyle ':omz:update' mode reminder         # напоминать об обновлениях, но не ставить молча
zstyle ':omz:update' frequency 14          # раз в 14 дней

# ─── Плагины OMZ (через ПРОБЕЛ, не запятую) ───────────────────────────
plugins=(
  git                       # десятки git-алиасов: gst, gco, gp, gcb, glog
  brew                      # автокомплит и алиасы для Homebrew
  macos                     # cdf (cd в папку Finder), quick-look, man-preview
  sudo                      # двойной ESC = подставить sudo в начало команды
  extract                   # x archive.zip / x file.tar.gz - универсальная распаковка
  copypath                  # copypath - путь файла в буфер обмена
  copyfile                  # copyfile - содержимое файла в буфер
  copybuffer                # Ctrl+O - текущая набранная команда в буфер
  command-not-found         # подскажет какой brew install нужен
  colored-man-pages         # man-страницы в цветах
  web-search                # google "запрос", duckduckgo "запрос"
  z                         # z имя_папки - переход в недавно посещённую
  history                   # h, hs - удобства с историей
)

source $ZSH/oh-my-zsh.sh


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 4. Дополнительные плагины (свой загрузчик с автоклонированием)       │
# │    Достаточно добавить строку в массив - при следующем запуске       │
# │    плагин склонируется и подключится автоматически.                  │
# └──────────────────────────────────────────────────────────────────────┘
zsh_plugins=(
  mattmc3/ez-compinit                          # быстрая инициализация автодополнения
  zsh-users/zsh-autosuggestions                # серым подсказывает команду из истории
  zsh-users/zsh-completions                    # расширенный автокомплит для кучи команд
  romkatv/powerlevel10k                        # тема (сама подгружается через ZSH_THEME)
  zdharma-continuum/fast-syntax-highlighting   # подсветка синтаксиса (ВСЕГДА ПОСЛЕДНИЙ)
)

# Стиль оформления автодополнений
zstyle ':plugin:ez-compinit' 'compstyle' 'zshzoo'

# Клонируем и подключаем
ZSH_PLUGINS_HOME=${ZDOTDIR:-$HOME}/.zsh_plugins
for zplugin in $zsh_plugins; do
  [[ -d $ZSH_PLUGINS_HOME/$zplugin ]] \
    || git clone --depth=1 https://github.com/$zplugin $ZSH_PLUGINS_HOME/$zplugin
  # Powerlevel10k подключается через ZSH_THEME, отдельный source не нужен
  if [[ "$zplugin" != "romkatv/powerlevel10k" ]]; then
    source $ZSH_PLUGINS_HOME/${zplugin}/${zplugin:t}.plugin.zsh 2>/dev/null \
      || source $ZSH_PLUGINS_HOME/${zplugin}/${zplugin:t}.zsh 2>/dev/null
  fi
done

# Подгрузка конфига p10k (создастся визардом p10k configure)
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 5. История команд                                                    │
# └──────────────────────────────────────────────────────────────────────┘
HISTFILE=~/.zsh_history
HISTSIZE=50000                  # сколько команд держать в памяти
SAVEHIST=50000                  # сколько сохранять на диск

setopt HIST_IGNORE_DUPS         # не сохранять подряд одинаковые
setopt HIST_IGNORE_ALL_DUPS     # удалять старые дубликаты
setopt HIST_IGNORE_SPACE        # команда с пробелом впереди не попадёт в историю
setopt HIST_REDUCE_BLANKS       # убирать лишние пробелы
setopt HIST_VERIFY              # !! и !$ показывают команду перед выполнением
setopt SHARE_HISTORY            # история общая между всеми открытыми терминалами
setopt INC_APPEND_HISTORY       # сохранять сразу после ввода, не при выходе
setopt EXTENDED_HISTORY         # с метками времени


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 6. Поведение шелла                                                   │
# └──────────────────────────────────────────────────────────────────────┘
setopt AUTO_CD                  # просто "Documents" вместо "cd Documents"
setopt CORRECT                  # "git stauts" → "did you mean git status?"
setopt INTERACTIVE_COMMENTS     # # комментарии работают в интерактиве
setopt AUTO_PUSHD               # cd запоминает стек посещённых папок
setopt PUSHD_IGNORE_DUPS        # без дубликатов в стеке
setopt PUSHD_SILENT             # без шума при pushd
setopt NO_BEEP                  # тишина при ошибке
setopt EXTENDED_GLOB            # расширенные шаблоны: ^foo, foo~bar, **/foo

# Tab-комплит без учёта регистра ("doc<TAB>" найдёт "Documents")
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# Меню выбора при двойном Tab
zstyle ':completion:*' menu select

# Цветной комплит файлов
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 7. Безопасные команды (страховка от случайного удаления)             │
# └──────────────────────────────────────────────────────────────────────┘
alias rm='rm -i'                # rm спросит подтверждение
alias cp='cp -i'                # cp спросит, если перезаписывает
alias mv='mv -i'                # mv спросит, если перезаписывает
alias mkdir='mkdir -p'          # mkdir создаст промежуточные папки


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 8. Навигация                                                         │
# └──────────────────────────────────────────────────────────────────────┘
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias ~='cd ~'
alias dl='cd ~/Downloads'
alias dt='cd ~/Desktop'
alias docs='cd ~/Documents'
alias o='open .'                # открыть текущую папку в Finder


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 9. Утилиты                                                           │
# └──────────────────────────────────────────────────────────────────────┘
alias c='clear'
alias h='history'
alias path='echo -e ${PATH//:/\\n}'                     # $PATH построчно
alias myip='curl -s ifconfig.me; echo'                  # внешний IP
alias localip="ipconfig getifaddr en0"                  # IP в локальной сети
alias myssid="networksetup -getairportnetwork en0"      # имя текущего Wi-Fi
alias ports='lsof -i -P -n | grep LISTEN'               # кто слушает какие порты
alias weather='curl -s "wttr.in/Moscow?lang=ru&M"'      # погода в Москве
alias zshrc='${EDITOR:-nano} ~/.zshrc'                  # быстро открыть конфиг
alias reload='source ~/.zshrc && echo "✓ конфиг перезагружен"'


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 10. Размеры и диск                                                   │
# └──────────────────────────────────────────────────────────────────────┘
alias df='df -h'
alias du='du -h'
alias dus='du -sh * 2>/dev/null | sort -h'              # размеры всех файлов в папке


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 11. macOS-специфика                                                  │
# └──────────────────────────────────────────────────────────────────────┘
alias showfiles='defaults write com.apple.finder AppleShowAllFiles -bool true && killall Finder'
alias hidefiles='defaults write com.apple.finder AppleShowAllFiles -bool false && killall Finder'
alias flushdns='sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder && echo "✓ DNS-кэш сброшен"'
alias emptytrash='rm -rfv ~/.Trash/*'                   # очистить корзину
alias sleepnow='pmset sleepnow'                         # усыпить мак
alias awake='caffeinate -d'                             # не давать маку засыпать
alias spot-on='sudo mdutil -a -i on'                    # включить Spotlight
alias spot-off='sudo mdutil -a -i off'                  # выключить (экономит CPU)


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 12. Современные замены классических утилит                           │
# │    Работают только если установлено через brew. Если нет -           │
# │    падают молча на системные команды.                                │
# └──────────────────────────────────────────────────────────────────────┘

# eza - замена ls с цветами и иконками
if command -v eza &>/dev/null; then
  alias ls='eza --icons --group-directories-first'
  alias ll='eza -lh --icons --git --group-directories-first'
  alias la='eza -lah --icons --git --group-directories-first'
  alias lt='eza --tree --level=2 --icons'
fi

# bat - cat с подсветкой синтаксиса
if command -v bat &>/dev/null; then
  alias cat='bat --paging=never'
  alias less='bat'
  export BAT_THEME="OneHalfDark"
fi

# zoxide - умный cd, запоминает папки с весом
# "cd proj" найдёт ~/Projects/my-project из истории посещений
if command -v zoxide &>/dev/null; then
  eval "$(zoxide init --cmd cd zsh)"
fi

# fzf - fuzzy-поиск (Ctrl+R история, Ctrl+T файлы, Alt+C папки)
[[ -f ~/.fzf.zsh ]] && source ~/.fzf.zsh


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 13. Функции                                                          │
# └──────────────────────────────────────────────────────────────────────┘

# mkcd - создать папку и сразу в неё перейти
mkcd() { mkdir -p "$1" && cd "$1"; }

# bak - бэкап файла с меткой времени
bak() { cp "$1" "$1.bak.$(date +%Y%m%d_%H%M%S)" && echo "✓ создан $1.bak.$(date +%Y%m%d_%H%M%S)"; }

# ff - найти файл по подстроке имени в текущей папке и подпапках
ff() { find . -type f -iname "*$1*" 2>/dev/null; }

# fdir - найти папку
fdir() { find . -type d -iname "*$1*" 2>/dev/null; }

# weather2 - погода для произвольного города
weather2() { curl -s "wttr.in/${1:-Moscow}?lang=ru&M"; }

# manp - открыть man-страницу в Preview.app красиво (PDF)
manp() { man -t "$@" | open -f -a Preview; }

# server - запустить простой HTTP-сервер в текущей папке (для теста html)
server() { python3 -m http.server "${1:-8000}"; }

# psg - найти процесс по имени (вместо ps aux | grep)
psg() { ps aux | grep -i "$1" | grep -v grep; }

# gencpw [длина] - сгенерировать случайный пароль (по умолчанию 24 символа)
gencpw() { openssl rand -base64 "${1:-24}" | tr -d '/+=' | head -c "${1:-24}"; echo; }

# make-exec - сделать файл исполняемым
make-exec() { chmod +x "$1" && echo "✓ $1 теперь исполняемый"; }


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 14. Помощь и обучение                                                │
# └──────────────────────────────────────────────────────────────────────┘

# Установка всех полезных утилит командой: setup-cli-tools
alias setup-cli-tools='brew install tldr htop ncdu tree jq wget rsync ripgrep fd eza bat zoxide fzf && echo "✓ Все утилиты установлены"'

# helpme <команда> - умная справка: пробует tldr → --help → man
# Пример: helpme tar
helpme() {
  if [[ -z "$1" ]]; then
    echo "Использование: helpme <команда>"
    echo "Пример: helpme tar"
    return 1
  fi
  if command -v tldr &>/dev/null; then
    tldr "$1" 2>/dev/null && return 0
  fi
  "$1" --help 2>/dev/null || man "$1"
}

# safe-curl <URL> - безопасно скачать скрипт, показать его, спросить запускать ли
# Пример: safe-curl https://example.com/install.sh
safe-curl() {
  if [[ -z "$1" ]]; then
    echo "Использование: safe-curl <URL>"
    return 1
  fi
  local tmp=$(mktemp)
  echo "→ Скачиваю $1 ..."
  if ! curl -fsSL "$1" -o "$tmp"; then
    echo "✗ Скачать не удалось"
    rm -f "$tmp"
    return 1
  fi
  echo "─── Содержимое (q - выйти из просмотра): ───"
  ${PAGER:-less} "$tmp"
  echo ""
  echo -n "Запустить через bash? [y/N] "
  read -r answer
  if [[ "$answer" == "y" || "$answer" == "Y" ]]; then
    bash "$tmp"
  else
    echo "Отменено. Скрипт сохранён: $tmp"
  fi
}

# make-ssh-key - сгенерировать SSH-ключ ed25519, положить публичную часть в буфер
# Используется для GitHub, серверов
make-ssh-key() {
  if [[ -f ~/.ssh/id_ed25519 ]]; then
    echo "⚠ Ключ ~/.ssh/id_ed25519 уже существует."
    echo -n "Перезаписать? Старый будет потерян! [y/N] "
    read -r answer
    [[ "$answer" != "y" && "$answer" != "Y" ]] && { echo "Отменено."; return 1; }
  fi
  echo -n "Email для ключа: "
  read -r email
  [[ -z "$email" ]] && { echo "✗ Email пустой, отмена"; return 1; }
  ssh-keygen -t ed25519 -C "$email" -f ~/.ssh/id_ed25519 || return 1
  pbcopy < ~/.ssh/id_ed25519.pub
  echo ""
  echo "✓ Публичный ключ скопирован в буфер обмена"
  echo "  GitHub:  Settings → SSH and GPG keys → New SSH key → вставить"
  echo "  Сервер:  ssh-copy-id user@host"
  echo "  Проверка GitHub: ssh -T git@github.com"
}

# cheat <тема> - встроенные шпаргалки. Без аргумента - список тем.
# Темы: basic, pipes, chmod, vim, nano, keys, emergency, net, git
cheat() {
  case "${1:-}" in
    basic)
      cat <<'CHEAT_EOF'
═══ 25 БАЗОВЫХ КОМАНД ═══

  pwd              где я сейчас
  cd <путь>        перейти в папку
  ls -lah          что в папке (подробно, со скрытыми)
  cat <файл>       показать файл
  less <файл>      пролистать длинный файл (q - выход)
  head -n / tail -n  первые / последние строки
  tail -f          живой просмотр (для логов)
  grep "X" file    поиск текста в файле
  find . -name X   поиск файлов по имени
  cp / mv / rm     копировать / переместить / удалить
  mkdir -p a/b/c   создать вложенные папки
  touch <файл>     создать пустой / обновить дату
  chmod +x file    сделать исполняемым
  ln -s tgt link   символическая ссылка
  echo $HOME       напечатать значение
  which git        где лежит команда
  man ls           руководство (q - выход)
  history          история команд
  ps aux           список процессов
  kill -9 PID      завершить процесс
  top              live-мониторинг (q - выход)
  df -h / du -h    диск / размеры
  curl -O URL      скачать файл
  ssh user@host    подключиться к серверу
  tar -czf out.tgz folder/   создать архив
  diff a b         сравнить файлы
CHEAT_EOF
      ;;
    pipes)
      cat <<'CHEAT_EOF'
═══ PIPES И ПЕРЕНАПРАВЛЕНИЕ ═══

  cmd > file        stdout в файл (перезаписать)
  cmd >> file       stdout в файл (дописать)
  cmd 2> err.log    stderr в файл
  cmd &> all.log    stdout И stderr в один файл
  cmd < file        stdin из файла
  cmd1 | cmd2       stdout cmd1 → stdin cmd2

ПРИМЕРЫ ЦЕПОЧЕК:

  ls -laS ~/Downloads | head -10        10 самых больших файлов
  ps aux | grep -i chrome | wc -l       сколько процессов Chrome
  du -sh ~/* | sort -h | tail -5        топ-5 жирных папок
  cat log | grep ERROR | sort -u        уникальные ошибки в логе
  history | grep brew | tail -20        последние 20 brew-команд
  find . -name "*.png" | wc -l          сколько png в дереве
CHEAT_EOF
      ;;
    chmod)
      cat <<'CHEAT_EOF'
═══ ПРАВА ДОСТУПА (chmod) ═══

  chmod +x file       сделать исполняемым
  chmod 755 file      rwxr-xr-x (стандарт для скриптов)
  chmod 644 file      rw-r--r-- (стандарт для документов)
  chmod 600 file      rw------- (только владелец, для ssh-ключей)
  chmod -R u+w folder рекурсивно дать запись владельцу
  ls -l               посмотреть текущие права

ЦИФРОВАЯ ЗАПИСЬ:
  4 = read (r)   2 = write (w)   1 = execute (x)
  Три цифры = владелец / группа / остальные

  Алиас: make-exec <file>   быстрый chmod +x
CHEAT_EOF
      ;;
    vim)
      cat <<'CHEAT_EOF'
═══ VIM - ВЫЖИТЬ И ВЫЙТИ ═══

  i              режим вставки текста (печатаешь как обычно)
  ESC            выйти из режима вставки

  :w             сохранить
  :q             выйти
  :wq            сохранить и выйти
  :q!            выйти БЕЗ сохранения (запомни как мантру)

  /текст         поиск (n - следующее, N - предыдущее)
  dd             удалить строку
  u              undo
  Ctrl+R         redo
  yy / p         скопировать строку / вставить
  gg / G         в начало / в конец файла
  :%s/old/new/g  заменить во всём файле
CHEAT_EOF
      ;;
    nano)
      cat <<'CHEAT_EOF'
═══ NANO ═══

  Ctrl+O          сохранить
  Ctrl+X          выйти
  Ctrl+W          найти
  Ctrl+\          найти и заменить
  Ctrl+K          вырезать строку
  Ctrl+U          вставить
  Ctrl+_          перейти на номер строки
  Alt+/           в конец файла
  Alt+\           в начало файла
CHEAT_EOF
      ;;
    keys)
      cat <<'CHEAT_EOF'
═══ ГОРЯЧИЕ КЛАВИШИ В ШЕЛЛЕ ═══

РЕДАКТИРОВАНИЕ КОМАНДЫ:
  Ctrl+A / Ctrl+E   в начало / в конец строки
  Ctrl+W            удалить слово влево
  Ctrl+U            удалить всё до начала строки
  Ctrl+K            удалить до конца
  Ctrl+L            очистить экран

ИСТОРИЯ:
  Ctrl+R            поиск по истории (с fzf - магия)
  Ctrl+P / ↑        предыдущая команда
  Ctrl+N / ↓        следующая команда
  !!                подставить предыдущую команду
  sudo !!           запустить предыдущую через sudo
  !$                последний аргумент предыдущей команды
  Alt+.             вставить последний аргумент
  ^old^new          предыдущая команда, заменив old на new

ZSH-СПЕЦИФИКА (этот конфиг):
  →                 принять подсказку autosuggestions
  ESC ESC           подставить sudo в начало команды
  Ctrl+O            копировать текущую команду в буфер
  Tab               автокомплит (без учёта регистра)
CHEAT_EOF
      ;;
    emergency)
      cat <<'CHEAT_EOF'
═══ ЭКСТРЕННЫЕ СИТУАЦИИ ═══

КОМАНДА ЗАВИСЛА:
  Ctrl+C          прервать (SIGINT)
  Ctrl+Z          приостановить (fg вернёт обратно)
  Ctrl+D          послать EOF (часто = выйти)
  Ctrl+\          SIGQUIT - сильнее Ctrl+C

ТЕРМИНАЛ ПОЛОМАЛСЯ:
  reset           полный сброс терминала
  clear           очистить экран
  Ctrl+L          то же что clear

ЗАСТРЯЛ В VIM:
  ESC : q ! Enter

ПОРТ ЗАНЯТ:
  lsof -i :8080     кто слушает порт
  kill -9 <PID>     убить процесс

ПАМЯТЬ КОНЧАЕТСЯ:
  top -o MEM        что жрёт память
  htop              то же красиво (brew install htop)

ДИСК ЗАБИЛСЯ:
  df -h             свободное место
  ncdu ~            интерактивный анализ (brew install ncdu)
  dus               алиас: размеры в текущей папке

КОМАНДА НЕ НАХОДИТСЯ:
  which <cmd>       где должна быть
  type <cmd>        алиас / функция / команда
  echo $PATH        список путей поиска
CHEAT_EOF
      ;;
    net)
      cat <<'CHEAT_EOF'
═══ СЕТЬ ═══

  ping example.com           пинг
  curl -I https://site.ru    HTTP-заголовки
  curl -O URL                скачать файл с тем же именем
  curl -o name URL           скачать с другим именем
  wget URL                   альтернатива curl
  myip                       алиас: внешний IP
  localip                    алиас: IP в локалке
  myssid                     алиас: имя текущего Wi-Fi
  ports                      алиас: кто слушает порты
  flushdns                   алиас: сброс DNS-кэша
  ssh user@host              подключение к серверу
  scp file user@host:/path   копирование на сервер
  rsync -avz src/ user@host:dst/   умное копирование с докачкой
  safe-curl URL              скачать скрипт + показать + спросить
CHEAT_EOF
      ;;
    git)
      cat <<'CHEAT_EOF'
═══ GIT (через OMZ-плагин) ═══

  gst              git status
  gco <branch>     git checkout
  gcb <branch>     git checkout -b (создать и переключиться)
  ga <file>        git add
  gaa              git add --all
  gcmsg "msg"      git commit -m "msg"
  gp / gpl         git push / git pull
  glog             git log с графом
  gd / gds         git diff / git diff --staged
  gpsup            git push --set-upstream origin <текущая>
  grb / grbi       git rebase / interactive
  gsta / gstp      git stash / stash pop
  gba              git branch --all

  Полный список:  alias | grep "^g"
CHEAT_EOF
      ;;
    *)
      cat <<'CHEAT_EOF'
Доступные шпаргалки (cheat <тема>):

  cheat basic       25 базовых команд
  cheat pipes       перенаправления и pipes
  cheat chmod       права доступа
  cheat vim         vim - выжить и выйти
  cheat nano        горячие клавиши nano
  cheat keys        клавиши в шелле
  cheat emergency   экстренные ситуации
  cheat net         сетевые команды
  cheat git         git-алиасы из OMZ

Полезные функции (см. ~/.zshrc):
  helpme <cmd>      tldr / --help / man по команде
  safe-curl <URL>   скачать скрипт + посмотреть + спросить
  make-ssh-key      сгенерировать SSH-ключ ed25519
  make-exec <file>  chmod +x
  psg <pattern>     найти процесс
  gencpw [N]        сгенерировать пароль
  mkcd <dir>        mkdir + cd
  bak <file>        бэкап с меткой времени
  ff / fdir <X>     найти файл / папку
  server [port]     HTTP-сервер в текущей папке

Установить весь рекомендуемый софт:
  setup-cli-tools
CHEAT_EOF
      ;;
  esac
}


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 15. Горячие клавиши - шпаргалка                                      │
# │                                                                      │
# │   →            принять подсказку zsh-autosuggestions                 │
# │   Tab          автокомплит (без учёта регистра)                      │
# │   Ctrl+R       поиск по истории через fzf                            │
# │   Ctrl+T       вставить путь к файлу через fzf                       │
# │   Alt+C        перейти в папку через fzf                             │
# │   ESC ESC      подставить sudo в начало команды                      │
# │   Ctrl+L       очистить экран                                        │
# │   Ctrl+A       в начало строки                                       │
# │   Ctrl+E       в конец строки                                        │
# │   Ctrl+W       удалить слово влево                                   │
# │   Ctrl+U       удалить всё до начала строки                          │
# │   Ctrl+O       копировать текущую набранную команду в буфер          │
# │                                                                      │
# └──────────────────────────────────────────────────────────────────────┘


# ┌──────────────────────────────────────────────────────────────────────┐
# │ 16. Мини-гайд при старте                                             │
# └──────────────────────────────────────────────────────────────────────┘
cat <<'STARTUP_GUIDE'

  ┌─ ПОМОЩЬ ─────────────────────────────────────────────────────────┐
  │  cheat              список встроенных шпаргалок                  │
  │  cheat basic        25 базовых команд                            │
  │  cheat keys         горячие клавиши шелла                        │
  │  cheat emergency    что делать если зависло / поломалось         │
  │  cheat git          git-алиасы                                   │
  │  helpme <cmd>       умная справка по команде (tldr → man)        │
  │                                                                  │
  ├─ УТИЛИТЫ ────────────────────────────────────────────────────────┤
  │  safe-curl <URL>    скачать скрипт + посмотреть + спросить       │
  │  make-ssh-key       сгенерировать SSH-ключ для GitHub            │
  │  gencpw [N]         сгенерировать пароль                         │
  │  mkcd <dir>         создать папку и зайти в неё                  │
  │  bak <file>         бэкап файла с меткой времени                 │
  │  ff / fdir <X>      найти файл / папку по имени                  │
  │  psg <name>         найти процесс                                │
  │                                                                  │
  ├─ КОНФИГ ─────────────────────────────────────────────────────────┤
  │  zshrc              открыть ~/.zshrc для редактирования          │
  │  reload             применить изменения в конфиге                │
  │  setup-cli-tools    установить весь рекомендуемый софт           │
  └──────────────────────────────────────────────────────────────────┘

STARTUP_GUIDE

Если код выше показался коротким - не пугайтесь. В этом файле выше я для краткости укоротил функцию cheat. Полная версия со всеми шпаргалками встроена в .zshrc пользователя выше по тексту - команда cheat basic сразу покажет 25 базовых команд прямо в терминале.

В TextEdit / nano / VS Code сохраните файл (Cmd + S или Ctrl + O в nano).

10. Шаг 7: применяем настройки

В терминале выполните:

source ~/.zshrc

Команда source говорит шеллу: «прочитай этот файл и выполни все команды из него». Это применяет конфиг без перезапуска терминала.

Что произойдёт при первом запуске:

  1. Загрузчик плагинов увидит, что ~/.zsh_plugins/ ещё пуст и скачает Powerlevel10k, fast-syntax-highlighting и autosuggestions из GitHub. Это займёт 10-30 секунд - в терминале будут бежать строки Cloning into '...'.
  2. После этого вы увидите красивую рамку с подсказкой команд.
  3. Промпт станет цветным - слева имя пользователя, имя машины, путь, время.

Если попробуете напечатать git (без Enter) - после набора нескольких букв шелл подсветит зелёным (команда существует). Напечатайте gitt - подсветится красным (опечатка).

Если у вас в истории команд есть git status - после ввода git st шелл серым допишет atus. Жмите стрелку вправо → - принять подсказку.

Поздравляю, у вас рабочий настроенный терминал.

11. Powerlevel10k - проходим визард (опционально)

В готовом конфиге выше я выбрал тему jonathan - минималистичную и быструю. Но если хотите попробовать Powerlevel10k (самая популярная и информативная тема), поменяйте одну строку:

# Найдите эту строку:
ZSH_THEME="jonathan"

# Замените на:
ZSH_THEME="powerlevel10k/powerlevel10k"

Сохраните, запустите source ~/.zshrc. При первом запуске Powerlevel10k запустит визард настройки - задаст 10-15 вопросов про оформление промпта.

Что вас спросят (в порядке появления):

  1. «Does this look like a diamond?» - видите ли вы ромб. Если нет - вам предложат поставить специальный шрифт MesloLGS NF. Соглашайтесь (y), потом нужно будет выбрать этот шрифт в настройках вашего терминала вручную (Terminal → Settings → Profiles → Font).
  1. «Does this look like a lock?» - видите ли значок замка. Аналогично.
  1. «Prompt Style» - какой стиль промпта вам ближе:
  1. «Character Set» - Unicode (рекомендую) или ASCII
  1. «Prompt Colors» - 8 цветов или 256
  1. «Show current time?» - показывать ли время в промпте
  1. «Prompt Separators» - стиль разделителей
  1. «Prompt Heads / Tails» - оформление концов сегментов
  1. «Prompt Frame» - рамка вокруг промпта (без рамки / линии слева / снизу / полная)
  1. «Prompt Connection» - точечные / тонкие / двойные линии
  1. «Prompt Frame Color» - цвет рамки
  1. «Spacing» - компактный или просторный (для воздуха)
  1. «Empty lines» - пустая строка между промптами (рекомендую да)
  1. «Instant Prompt mode» - моментальный показ промпта при загрузке. Выбирайте Verbose (рекомендуемый). Это та самая фича Powerlevel10k - промпт показывается до того, как все плагины загрузились.

После этого визард сохранит настройки в ~/.p10k.zsh. Этот файл подгружается автоматически последней строкой готового конфига.

Захотите перенастроить - запустите:

p10k configure

12. Что вы получили: разбор по разделам

Теперь пройдёмся по тому, что добавил конфиг, чтобы вы знали, как этим пользоваться.

12.1 Безопасные команды

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

Теперь rm file.txt спросит: remove file.txt? (y/n). Никакого случайного удаления.

cp и mv спросят, если перезаписывают существующий файл.

12.2 Большая общая история

HISTSIZE=50000
SAVEHIST=50000
setopt SHARE_HISTORY

Команды сохраняются между сессиями (закрыли терминал - открыли - история на месте) и между всеми открытыми окнами одновременно. В одном окне написали команду - в другом сразу её видно через или Ctrl+R.

12.3 Поиск по истории через Ctrl+R

Нажмите Ctrl + R, начните писать любой кусочек команды из прошлого - откроется fzf-интерфейс с поиском по истории. Стрелочки выбирают, Enter применяет, Esc отменяет.

12.4 Автодополнение без учёта регистра

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

Теперь cd doc + Tab найдёт Documents. Не нужно помнить, заглавная там буква или нет.

12.5 AUTO_CD - cd по имени папки

setopt AUTO_CD

Можно писать просто Documents вместо cd Documents - шелл сам поймёт, что вы хотите перейти в папку.

12.6 sudo с двойного ESC

Плагин sudo подключён в массиве. Забыли sudo в начале? Дважды нажмите Esc - в начало команды подставится sudo . Очень удобно.

12.7 Алиасы навигации

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias dl='cd ~/Downloads'
alias dt='cd ~/Desktop'
alias docs='cd ~/Documents'
alias o='open .'

.. поднимет на уровень вверх. dl - в Downloads. o - откроет текущую папку в Finder.

12.8 Полезные алиасы для macOS

showfiles      # показать скрытые файлы в Finder (не нужно жать Cmd+Shift+.)
hidefiles      # скрыть обратно
flushdns       # сбросить DNS-кэш если сайт не открывается
emptytrash     # очистить корзину
sleepnow       # усыпить мак
awake          # запретить маку засыпать (полезно при долгой загрузке)
myip           # ваш внешний IP-адрес
localip        # IP в локальной сети
myssid         # имя текущего Wi-Fi
ports          # кто слушает какие порты

12.9 Современные замены ls / cat / cd

Если поставили eza, bat, zoxide:

  • ls теперь работает через eza - с цветами и иконками
  • ll - подробный список с git-статусом каждого файла
  • lt - дерево папок на 2 уровня
  • cat file.json теперь работает через bat - JSON будет в подсветке
  • cd <часть_имени> - zoxide найдёт папку в истории посещённых

12.10 Утилитные функции

  • mkcd new-project - создать папку и сразу в неё перейти
  • bak important.txt - создать копию important.txt.bak.20260426_153045
  • ff "report" - найти все файлы со словом «report» в имени
  • fdir "config" - найти папки со словом «config»
  • psg chrome - найти процессы Chrome (ps aux | grep короче)
  • gencpw 32 - сгенерировать случайный пароль на 32 символа
  • serve 8080 - запустить веб-сервер на порту 8080 в текущей папке (для проверки HTML)

12.11 Команда cheat - встроенные шпаргалки

cheat            # список всех тем
cheat basic      # 25 базовых команд
cheat pipes      # перенаправления, конвейеры
cheat chmod      # права доступа
cheat vim        # как выйти из vim (главное)
cheat nano       # горячие клавиши nano
cheat keys       # горячие клавиши шелла
cheat emergency  # что делать если зависло, диск забит, порт занят
cheat net        # сетевые команды
cheat git        # git-алиасы из OMZ

Шпаргалки прямо в терминале. Не нужно гуглить или открывать браузер.

12.12 Команда helpme - умная справка

Вместо длинного man tar, который ошарашивает 500 строками:

helpme tar

Показывает 5-7 типичных примеров через tldr. Если tldr не установлен - покажет --help. Если и его нет - откроет man.

12.13 safe-curl - безопасное скачивание скриптов

Когда вы видите в интернете «установите наш софт командой»:

curl -fsSL https://example.com/install.sh | bash

Это опасно - вы запускаете чужой код, не глядя. Безопаснее:

safe-curl https://example.com/install.sh

Скрипт скачается, откроется в просмотровщике, вы прочитаете, что он делает. После выхода (q) шелл спросит: «Запустить через bash? [y/N]». Уверены - y. Нет - n.

12.14 make-ssh-key - SSH-ключ для GitHub

Запустите:

make-ssh-key

Спросит email → создаст ключ ed25519 → положит публичную часть в буфер обмена. Дальше вы идёте на GitHub → Settings → SSH and GPG keys → New SSH key → вставляете → готово.

После этого git clone git@github.com:... и git push будут работать без ввода пароля.

13. 25 базовых команд, которые надо знать

| Команда | Что делает | Пример |
|---------|------------|--------|
| pwd | где я сейчас | pwd |
| cd | перейти в папку | cd ~/Documents |
| ls | что в папке | ls -lah |
| cat | показать файл | cat README.md |
| less | пролистать длинный файл | less log.txt |
| head | первые строки | head -20 file.txt |
| tail | последние строки | tail -f log.txt |
| grep | поиск по тексту | grep "error" log.txt |
| find | поиск файлов | find . -name "<em>.png" |
| cp | копировать | cp a.txt b.txt |
| mv | переместить | mv old.txt new.txt |
| rm | удалить | rm file.txt |
| mkdir | создать папку | mkdir -p a/b/c |
| touch | создать пустой файл | touch file.txt |
| chmod | права на файл | chmod +x script.sh |
| ln -s | символическая ссылка | ln -s /target /link |
| echo | напечатать текст | echo $HOME |
| which | где лежит команда | which git |
| man | руководство | man ls |
| ps | список процессов | ps aux |
| kill | завершить процесс | kill -9 12345 |
| top | live-мониторинг | top |
| df | свободное место | df -h |
| du | размер файлов | du -sh </em> |
| curl | скачать по URL | curl -O URL |

Из любой команды выйти - q (man, less, top).

14. Что делать, если что-то пошло не так

14.1 Конфиг не работает / терминал сыплет ошибками при старте

Откатитесь к старому конфигу. Бэкап у вас есть:

mv ~/.zshrc.backup-20260426 ~/.zshrc
source ~/.zshrc

Или к самому первому, который сделал Oh My Zsh:

mv ~/.zshrc.pre-oh-my-zsh ~/.zshrc
source ~/.zshrc

14.2 Хочу удалить Oh My Zsh полностью

uninstall_oh_my_zsh

Эта команда удалит OMZ и вернёт ваш предыдущий .zshrc.

14.3 Команда brew не находится

После установки Homebrew нужно добавить его в $PATH. Раскомментируйте в конфиге строку:

eval "$(/opt/homebrew/bin/brew shellenv)"

Или (для Intel-маков) /usr/local/bin/brew.

14.4 Иконки в eza / Powerlevel10k - не отображаются (вижу квадратики)

Нужен Nerd Font. Установите MesloLGS NF (Powerlevel10k предлагает сам), либо:

brew install --cask font-meslo-lg-nerd-font

Затем в Terminal → Settings → Profiles → Text → Font выберите этот шрифт.

14.5 Случайно удалил .zshrc целиком

Не страшно. Создайте пустой и вставьте конфиг заново:

touch ~/.zshrc
open -e ~/.zshrc

14.6 Команда zsh зависла или мне нужно срочно выйти

  • Ctrl + C - прервать текущую команду
  • Ctrl + D - выйти из терминала
  • Ctrl + Z - приостановить (потом fg вернёт)
  • Закрыть окно (Cmd + W) - всегда работает

15. Безопасность в командной строке

Несколько правил, которые избавят от 90% проблем:

Правило 1. Не запускайте чужие скрипты вслепую. Когда видите curl url | bash - используйте вместо этого safe-curl url из конфига или скачайте сначала, прочитайте, потом запустите.

Правило 2. sudo = бог. Команды с sudo выполняются от имени root и могут уничтожить систему. Подумайте дважды перед sudo rm. Знаменитый пример катастрофы - sudo rm -rf $VAR/, где переменная $VAR оказалась пустой - команда превратилась в sudo rm -rf / и удалила всю систему.

Правило 3. Не работайте под sudo постоянно. Только когда команда явно требует системных прав (установка системных пакетов, изменение /etc/).

Правило 4. Файлы .env, ключи, пароли - не коммитьте в git. Добавьте в .gitignore. Один забытый .env в публичном репозитории - и ваши API-ключи в открытом доступе через 30 секунд (боты сканируют GitHub).

Правило 5. SSH-ключи без пароля - только для личного использования. Если ключ утечёт - утечёт доступ ко всем серверам. На рабочих машинах ставьте пароль на ключ.

Правило 6. Пароли генерируйте, а не придумывайте. Из конфига - gencpw 32. Используйте менеджер паролей (1Password, Bitwarden).

16. Куда двигаться дальше

Если зашло и хочется глубже:

Курсы и книги (бесплатные)

  • The Missing Semester of Your CS Education (MIT) - missing.csail.mit.edu - короткий курс «то, чему не учат на CS, но что нужно каждый день». Есть на YouTube с русскими субтитрами
  • The Linux Command Line Уильяма Шоттса - бесплатная книга, есть русский перевод. Лучшая книга для глубокого понимания shell

Онлайн-инструменты

  • explainshell.com - вставляешь любую команду, получаешь разбор каждого флага. Незаменимо, когда читаешь чужие скрипты
  • cheat.sh - curl cht.sh/tar показывает примеры прямо из терминала, без браузера
  • shellcheck.net - онлайн-линтер для shell-скриптов, найдёт типичные ошибки

Что ещё стоит освоить

  • Vim - не для красоты, а потому что на серверах часто только он. Хватит знать i, Esc, :w, :q, :wq, :q!
  • Git - команды через OMZ-плагин уже под рукой (gst, gco, gp). Дальше - branching, rebasing, merge conflicts
  • SSH - подключение к серверам, проброс портов (-L, -R)
  • tmux - терминал-мультиплексор, позволяет иметь много панелей в одном окне

Терминал получше

Дефолтный Terminal.app работает, но iTerm2 - заметно лучше. Поддерживает разделённые панели, неограниченную историю, поиск по выводу, профили. Скачать: iterm2.com.

Также популярны:
- Warp - современный терминал на Rust с AI-подсказками
- Alacritty - сверхбыстрый GPU-ускоренный терминал
- WezTerm - кросс-платформенный, очень настраиваемый


Заключение

За 30-40 минут чтения и копи-паста вы прошли путь от пустого Terminal.app до настроенного рабочего инструмента. Что важнее - вы теперь понимаете, как это устроено, а не просто следуете инструкции.

Что я бы посоветовал делать дальше:

  1. Не пытайтесь запомнить все алиасы сразу. Откройте cheat git, cheat keys, cheat basic несколько раз - запомнятся те, что вам реально нужны
  2. Используйте helpme <команда> вместо гугла, когда забыли синтаксис
  3. Добавляйте свои алиасы - откройте ~/.zshrc (команда zshrc), добавьте alias myalias='команда', перезагрузите (reload)
  4. Каждый раз, когда повторяете одну и ту же команду 3+ раза - сделайте на неё алиас или функцию
  5. Бэкапьте .zshrc - например, держите копию в git-репозитории. Тогда при переустановке Mac или новом компьютере достаточно склонировать и применить

Терминал - не «древний пережиток для гиков», а самый эффективный способ управления компьютером. Один раз настроив, вы сэкономите тысячи кликов мышью в будущем.

Удачи в освоении.

Комментарии (0)

Пока нет комментариев.

Программы упомянутые в статье