Терминал и zsh: командная строка macOS

Рейтинг: 55.2% · 12 голосов
Подробный курс по 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: командная строка macOS

Сообщение 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 как у профи + куда расти
Кликаешь по System Settings, чтобы поменять одну галку, потом по второй, потом ищешь третью через поиск - а в терминале это одна строка, которую можно сохранить, повторить на сотне маков и засунуть в скрипт. Графический интерфейс хорош ровно до того момента, пока ты не начал делать одно и то же дважды. Дальше - терминал. Это не "для гиков": половина того, что в этом курсе про defaults, launchctl, diskutil, fdesetup и brew, живёт именно в командной строке. Если ты пока боишься чёрного окна - после этого урока перестанешь.

Разберём, как устроен Terminal.app, почему в macOS теперь zsh а не bash, где реально настраивается shell, как ведёт себя PATH на Apple Silicon (это грабли номер один) и какие команды специфичны именно для мака - open, pbcopy, pbpaste. Запросы вроде "терминал mac", "mac os терминал", "командная строка mac", "терминал macos команды" - всё про это.

Terminal.app: что это и как его готовить

Терминал на маке - это эмулятор терминала. Сам по себе он не выполняет команды. Это окно, которое рисует текст и передаёт нажатия клавиш в shell - программу-интерпретатор (по умолчанию zsh), которая уже разбирает твои команды и запускает процессы. Разделяй два слоя: терминал (окно, цвета, шрифт, вкладки) и shell (синтаксис, история, PATH). Меняя один, второй не трогаешь.

Открыть терминал mac можно несколькими путями. Из Spotlight: Cmd+Пробел, набираешь Terminal. Лежит он в /System/Applications/Utilities/Terminal.app (в Tahoe системные приложения переехали под /System). Из Finder удобнее всего так: открой нужную папку, в меню Finder включи путь снизу, кликни по папке правой кнопкой - Новый терминал в папке (Services). Или перетащи папку прямо на иконку терминала - откроется уже в ней.

Профили (Settings -> Profiles) - это сохранённые наборы внешнего вида и поведения. Тёмный Pro, светлый Basic, свой с крупным шрифтом для демо. Здесь же цвета ANSI, прозрачность, поведение Cmd+W, сколько строк держать в буфере прокрутки. Полезное:
  • Cmd+T - новая вкладка, Cmd+N - новое окно, Cmd+D - разделить панель по горизонтали.
  • Cmd+K - очистить буфер прокрутки полностью (не путать с командой clear, которая лишь сдвигает экран).
  • Профиль можно назначить дефолтным кнопкой Default - именно он откроется при Cmd+N.
Альтернативы. Штатного терминала хватает надолго, но профи часто ставят что-то побыстрее и поудобнее:
  • iTerm2 - классика. Сплиты, поиск по выводу, профили на стероидах, триггеры, интеграция с shell.
  • Ghostty - молодой быстрый терминал на GPU, минимализм и скорость.
  • Warp - терминал с блочным выводом и подсказками, ставка на современный UX.
Ставятся одной строкой через Homebrew (про него отдельная глава):

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

brew install --cask iterm2
или

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

brew install --cask ghostty
. Важно: альтернативный терминал - это другое окно, но shell внутри всё тот же zsh с теми же конфигами. Перенастраивать заново ничего не нужно.

Изображение

Почему zsh, а не bash: история и суть

До macOS Catalina (2019) дефолтным shell был bash. Начиная с Catalina и по сей день (включая macOS 26 Tahoe) - это zsh (Z shell). Причина смены не техническая прихоть, а лицензия. Apple застряла на bash версии 3.2 - последней под GPLv2. Все более новые bash вышли под GPLv3, а этот лицензионный режим Apple себе не позволяет: GPLv3 требует, среди прочего, разрешать пользователю ставить свои сборки на устройство (анти-"тивоизация") и несёт явные патентные оговорки - всё это конфликтует с моделью подписанного кода и закрытых устройств Apple. zsh распространяется под мягкой MIT-подобной лицензией, без этих обязательств. Поэтому zsh.

Проверь, какой shell у тебя сейчас:

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

% echo $SHELL
/bin/zsh
% zsh --version
zsh 5.9 (arm64-apple-darwin25.0)
Строка arm64-apple-darwin25.0 - это Apple Silicon (arm64) и ядро Darwin под Tahoe. На Intel-маке было бы x86_64. Сам zsh лежит в /bin/zsh, это системная сборка Apple. Поменять дефолтный shell для своего пользователя можно через chsh, но в 99% случаев не нужно - zsh всем хорош.

Важная мелочь про синтаксис приглашения: в zsh у обычного пользователя приглашение оканчивается на %, а у root - на #. В этом уроке я в выводе ставлю %, чтобы было видно границу "вот это я набрал, а это ответ системы".

zsh на практике: история, Tab-дополнение, навигация

Базовая навигация - это BSD-инструменты, не GNU. Это первая грабля для тех, кто пришёл с Linux: флаги местами другие (про это - дальше).

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

% pwd                # где я сейчас
/Users/anna
% ls -la             # содержимое с правами и скрытыми файлами
% cd ~/Documents     # ~ это твой домашний каталог
% cd -               # вернуться в предыдущий каталог
% cd ..              # на уровень вверх
Tab-автодополнение - то, ради чего стоит полюбить zsh. Начни писать имя файла или команды и жми Tab. zsh дополнит. Если вариантов несколько - покажет список и даст листать его повторными нажатиями Tab (это меню-комплишн, фишка zsh, которой в голом bash нет). Дополняются не только файлы, но и команды, опции, имена хостов из ssh, ветки git.

История команд хранится в файле ~/.zsh_history. Стрелки вверх/вниз листают её. Гораздо мощнее - поиск: жми Ctrl+R и набирай кусок старой команды, zsh найдёт последнее совпадение. Ещё Ctrl+R - предыдущее. Полезные обращения к истории:

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

% !!          # повторить предыдущую команду целиком
% sudo !!     # повторить предыдущую, но через sudo (классика после "permission denied")
% !$          # последний аргумент прошлой команды
% history     # показать пронумерованный список
Сценарий из жизни: набрал mkdir /usr/local/share/mytool, получил "Permission denied", набираешь sudo !! - и команда повторяется с правами. Не нужно перепечатывать длинную строку.

Где shell настраивается: файлы zsh и их порядок

Это сердце урока и источник большинства "у меня PATH сломался". zsh читает несколько файлов и в строгом порядке. Для каждого терминала на маке открывается интерактивный login-shell, поэтому читаются почти все:
  • /etc/zshenv затем ~/.zshenv - всегда, для любого запуска (даже неинтерактивного скрипта). Сюда тяжёлое не клади.
  • /etc/zprofile затем ~/.zprofile - только для login-shell. macOS в /etc/zprofile запускает утилиту path_helper, которая собирает PATH из /etc/paths и /etc/paths.d.
  • /etc/zshrc затем ~/.zshrc - для интерактивного shell. Сюда - алиасы, prompt, функции, опции. Это файл, который правят чаще всего.
  • /etc/zlogin затем ~/.zlogin - в самом конце login-shell, нужен редко.
Запомни так: .zshrc - повседневные удобства, .zprofile - окружение и PATH. Посмотреть и быстро отредактировать:

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

% open -e ~/.zshrc          # открыть в TextEdit
% nano ~/.zshrc             # или в nano прямо в терминале
После правки изменения не подхватываются автоматически в уже открытых окнах. Перечитать файл в текущей сессии:

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

% source ~/.zshrc
Полезные алиасы в ~/.zshrc, экономящие нажатия:

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

alias ll='ls -lah'
alias ..='cd ..'
alias gs='git status'
export EDITOR=nano
PATH на Apple Silicon: главная грабля /opt/homebrew/bin

PATH - это список каталогов, в которых shell ищет исполняемые команды, через двоеточие, по порядку слева направо. Когда ты пишешь brew, zsh идёт по PATH и берёт первый найденный brew.

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

% echo $PATH
/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
% which brew
/opt/homebrew/bin/brew
Ключевой момент про Apple Silicon: Homebrew ставится в /opt/homebrew, а на Intel-маках исторически в /usr/local. И /opt/homebrew/bin не входит в дефолтный PATH. Поэтому свежеустановленный brew выдаёт классику "zsh: command not found: brew". Лечится тем, что добавляет сам установщик Homebrew - строкой в ~/.zprofile:

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

eval "$(/opt/homebrew/bin/brew shellenv)"
Эта команда не просто дописывает PATH вручную, а вычисляет и экспортирует сразу несколько переменных (PATH, MANPATH, INFOPATH, HOMEBREW_PREFIX и др.) - правильно и переносимо. Положить её надо именно в .zprofile, а не в .zshrc: так PATH соберётся один раз для login-shell, поверх того, что насыпал path_helper, и Homebrew окажется в начале списка - то есть его версии утилит будут перебивать системные. После правки - открой новое окно терминала или сделай source ~/.zprofile.

Грабли подытожу: если команда "не находится" - смотри echo $PATH и which имя_команды. Если which молчит, а ты точно знаешь, что бинарь стоит в /opt/homebrew/bin - значит PATH не подхватил Homebrew, чини .zprofile.

sudo: запуск от root без входа в root

Многие системные действия требуют прав суперпользователя. sudo выполняет одну команду от имени root, спросив твой пароль (не пароль root - его в macOS обычно вообще нет). При вводе пароль не отображается - ни звёздочек, ни точек, это нормально, просто печатай и жми Enter.

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

% sudo nano /etc/hosts
Password:
Пароль кэшируется на несколько минут, чтобы не вводить его на каждую команду подряд. Правила, кто и что может через sudo, лежат в /etc/sudoers - и редактировать их надо только через visudo (он проверяет синтаксис перед сохранением, иначе можно заблокировать себе sudo целиком):

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

% sudo visudo
Здравый принцип: не лепи sudo ко всему подряд. Если команда работает без него - значит, root не нужен, и так безопаснее. Лишний sudo - это шанс случайно снести системный файл или испортить права в своём же домашнем каталоге (файлы вдруг станут принадлежать root).

macOS-специфика: open, pbcopy, pbpaste

Вот команды, которых нет ни в каком Linux - это чистый мак, мостик между терминалом и графическим окружением.

open - открыть что угодно так, будто ты дважды кликнул в Finder:

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

% open .                       # открыть текущую папку в Finder
% open report.pdf              # открыть файл дефолтным приложением
% open -a "Visual Studio Code" .   # открыть текущую папку конкретным приложением
% open -R ~/Downloads/file.zip # показать (reveal) файл в Finder, подсветив его
% open -e notes.txt            # открыть в TextEdit
% open https://cyberlake.ru    # открыть URL в браузере по умолчанию
Разбор флагов: -a задаёт приложение явно (имя или путь к .app-бандлу), -R не открывает файл, а показывает его в Finder, -e форсит TextEdit. Команда open понимает, что macOS-приложение - это не один бинарь, а .app-бандл (папка с Info.plist внутри), и сама находит точку входа. Реальный сценарий: упала сборка, в логах путь к файлу - делаешь open -R на этот путь и сразу видишь его в Finder.

pbcopy / pbpaste - работа с буфером обмена (pasteboard) из командной строки. pbcopy забирает stdin в буфер, pbpaste выдаёт содержимое буфера в stdout:

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

% pbpaste                          # вывести то, что сейчас в буфере обмена
% cat ~/.ssh/id_ed25519.pub | pbcopy   # скопировать публичный ключ в буфер
% pwd | pbcopy                     # положить текущий путь в буфер
% pbpaste | wc -l                  # сколько строк в скопированном тексте
Это связка терминала и любого графического приложения: скопировал в браузере таблицу - pbpaste | grep ... выдернул нужное; сгенерил ключ - сразу pbcopy и вставляй в настройки GitHub без мышиного выделения по символам.

Типичные грабли
  • command not found: brew на Apple Silicon. Причина - PATH без /opt/homebrew/bin. Лечение в .zprofile через brew shellenv (см. выше), потом новое окно.
  • Правки в .zshrc не действуют. Открытые окна не перечитывают файл сами. source ~/.zshrc или новая вкладка.
  • BSD vs GNU. Утилиты в macOS из BSD, флаги отличаются. Например sed -i на маке требует аргумент: sed -i '' 's/a/b/' file (пустые кавычки - суффикс бэкапа), а в Linux пишут просто sed -i. У date, ls, find тоже свои отличия. Хочешь GNU-поведение - ставь coreutils/gnu-sed через brew (они кладутся с префиксом g: gsed, gls).
  • Пробелы в путях. Имя "My Project" без экранирования zsh поймёт как два аргумента. Бери в кавычки: cd "My Project", или экранируй: cd My\ Project. Tab-дополнение делает это за тебя автоматически.
  • sudo там, где не надо. Привычка "если ошибка - добавь sudo" портит права. Сначала разберись, почему отказ.
  • Опасные команды. rm -rf не спрашивает и не кладёт в Корзину - удаляет навсегда. Дважды смотри на путь, особенно если в строке есть переменная (пустая $VAR превратит rm -rf $VAR/ в удаление корня каталога).
Мини-лаба: повторить руками (10 минут)
  • Открой терминал тремя способами: Spotlight, из Finder (правый клик по папке -> Новый терминал в папке), перетаскиванием папки на иконку.
  • Выполни echo $SHELL, zsh --version, echo $PATH. Найди, есть ли в PATH /opt/homebrew/bin.
  • which ls и which brew - посмотри, откуда берутся команды. Если brew не находится, а Homebrew стоит - почини .zprofile строкой brew shellenv и открой новое окно.
  • Добавь в ~/.zshrc алиас alias ll='ls -lah', сделай source ~/.zshrc, проверь командой ll.
  • Поиграй с историей: набери несколько команд, потом Ctrl+R и кусок одной из них. Затем sudo !! после любой команды, упавшей по правам.
  • pwd | pbcopy, затем pbpaste - убедись, что путь в буфере. open . - открой текущую папку в Finder. open -R на любой файл - подсветка в Finder.
  • Создай папку с пробелом: mkdir "test dir", зайди в неё через Tab-дополнение (набери cd test и жми Tab - zsh сам экранирует).
Контрольные вопросы
  • Почему Apple сменила bash на zsh в Catalina и при чём тут лицензия GPLv3?
  • Чем .zshrc отличается от .zprofile и куда правильно класть инициализацию Homebrew на Apple Silicon - и почему именно туда?
  • Команда brew выдаёт "command not found" сразу после установки на M-маке. Какие две команды ты выполнишь для диагностики и что будешь чинить?
  • Что делает open -R, чем -a отличается от -e, и как одной строкой положить содержимое файла в буфер обмена?
Итог

Терминал - это окно, shell (zsh) - интерпретатор внутри него; путаница между ними рождает половину вопросов новичков. zsh - дефолт с Catalina из-за лицензии bash, настраивается через .zshenv/.zprofile/.zshrc/.zlogin в строгом порядке, и PATH на Apple Silicon почти всегда чинится одной строкой brew shellenv в .zprofile. open, pbcopy и pbpaste - твои мостики между командной строкой и графикой мака. Дальше в курсе мы на этом фундаменте строим работу с defaults, launchctl, diskutil и безопасностью - там терминал из удобства превращается в основной инструмент.
👍1 ❤️2 🔥4 😄 🤔2
Аватара пользователя
ElasticChan
Сообщения: 1
Зарегистрирован: 14 май 2026, 07:59

Re: Терминал и zsh: командная строка macOS

Сообщение ElasticChan »

Сидел с command not found brew две недели, тыкал export PATH в zshrc - не помогало. Оказалось надо именно brew shellenv в zprofile. Спасибо, теперь понятно почему не в zshrc.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
weekendpanic
Сообщения: 1
Зарегистрирован: 13 май 2026, 19:19

Re: Терминал и zsh: командная строка macOS

Сообщение weekendpanic »

А правда что в Tahoe это последняя версия с интелом? У меня старый mbp 2019, успею пройти курс пока его не выкинули из поддержки)
👍3 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Пользователи и группы: учётные записи и управление
Следующая глава →
CLI на macOS: BSD-команды и отличия от Linux

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

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

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

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

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