Разберём, как устроен 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.
Код: Выделить всё
brew install --cask iterm2Код: Выделить всё
brew install --cask ghostty
Почему 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)
Важная мелочь про синтаксис приглашения: в zsh у обычного пользователя приглашение оканчивается на %, а у root - на #. В этом уроке я в выводе ставлю %, чтобы было видно границу "вот это я набрал, а это ответ системы".
zsh на практике: история, Tab-дополнение, навигация
Базовая навигация - это BSD-инструменты, не GNU. Это первая грабля для тех, кто пришёл с Linux: флаги местами другие (про это - дальше).
Код: Выделить всё
% pwd # где я сейчас
/Users/anna
% ls -la # содержимое с правами и скрытыми файлами
% cd ~/Documents # ~ это твой домашний каталог
% cd - # вернуться в предыдущий каталог
% cd .. # на уровень вверх
История команд хранится в файле ~/.zsh_history. Стрелки вверх/вниз листают её. Гораздо мощнее - поиск: жми Ctrl+R и набирай кусок старой команды, zsh найдёт последнее совпадение. Ещё Ctrl+R - предыдущее. Полезные обращения к истории:
Код: Выделить всё
% !! # повторить предыдущую команду целиком
% sudo !! # повторить предыдущую, но через sudo (классика после "permission denied")
% !$ # последний аргумент прошлой команды
% history # показать пронумерованный список
Где 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, нужен редко.
Код: Выделить всё
% open -e ~/.zshrc # открыть в TextEdit
% nano ~/.zshrc # или в nano прямо в терминале
Код: Выделить всё
% source ~/.zshrc
Код: Выделить всё
alias ll='ls -lah'
alias ..='cd ..'
alias gs='git status'
export EDITOR=nano
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
Код: Выделить всё
eval "$(/opt/homebrew/bin/brew shellenv)"
Грабли подытожу: если команда "не находится" - смотри echo $PATH и which имя_команды. Если which молчит, а ты точно знаешь, что бинарь стоит в /opt/homebrew/bin - значит PATH не подхватил Homebrew, чини .zprofile.
sudo: запуск от root без входа в root
Многие системные действия требуют прав суперпользователя. sudo выполняет одну команду от имени root, спросив твой пароль (не пароль root - его в macOS обычно вообще нет). При вводе пароль не отображается - ни звёздочек, ни точек, это нормально, просто печатай и жми Enter.
Код: Выделить всё
% sudo nano /etc/hosts
Password:
Код: Выделить всё
% sudo visudo
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 в браузере по умолчанию
pbcopy / pbpaste - работа с буфером обмена (pasteboard) из командной строки. pbcopy забирает stdin в буфер, pbpaste выдаёт содержимое буфера в stdout:
Код: Выделить всё
% pbpaste # вывести то, что сейчас в буфере обмена
% cat ~/.ssh/id_ed25519.pub | pbcopy # скопировать публичный ключ в буфер
% pwd | pbcopy # положить текущий путь в буфер
% pbpaste | wc -l # сколько строк в скопированном тексте
Типичные грабли
- 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/ в удаление корня каталога).
- Открой терминал тремя способами: 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 и безопасностью - там терминал из удобства превращается в основной инструмент.