Разберемся, как реально устроены системные настройки mac изнутри, где лежат файлы, почему defaults write иногда "не срабатывает", чем тут поможет cfprefsd, и как собрать скрипт автонастройки нового Mac. В конце - про парк машин и профили конфигурации как взрослую альтернативу скриптам.
Что такое System Settings и где лежат настройки
Начиная с macOS Ventura приложение называется Системные настройки (System Settings), а не System Preferences как было до этого. Apple переделала его в стиле iOS - боковая панель со списком разделов вместо сетки иконок. На macOS 26 Tahoe (2025, последняя версия с поддержкой Intel) это все тот же System Settings, просто еще немного причесанный. Для нас важно не как оно выглядит, а что под капотом ничего не поменялось: GUI - это просто красивая морда поверх системы пользовательских настроек (user defaults).
Физически настройки - это property list файлы, plist. Лежат они по нескольким уровням, и порядок тут не случайный:
- ~/Library/Preferences/ - настройки твоего пользователя. Тут живет com.apple.dock.plist, com.apple.finder.plist и сотни других.
- ~/Library/Preferences/ByHost/ - настройки пользователя, привязанные к конкретной машине (по Hardware UUID в имени файла). Сюда пишет флаг -currentHost.
- /Library/Preferences/ - системные настройки, общие для всех пользователей. Запись сюда требует sudo.
- /Library/Managed Preferences/ - сюда MDM кладет управляемые настройки из профилей конфигурации. Это приоритет над тем, что юзер наставил сам.

defaults read: как заглянуть внутрь
Любой plist адресуется парой домен -> ключ. Домен - это, как правило, bundle identifier приложения в обратной нотации: com.apple.dock, com.apple.finder. Команда defaults read mac-настроек без аргументов вывалит вообще все домены пользователя (огромная простыня), поэтому почти всегда указывают домен:
Код: Выделить всё
$ defaults read com.apple.dock
{
autohide = 0;
"mineffect" = genie;
"orientation" = bottom;
"show-recents" = 1;
tilesize = 48;
}
Код: Выделить всё
$ defaults read com.apple.dock tilesize
48
Код: Выделить всё
$ defaults read-type com.apple.dock tilesize
Type is integer
Код: Выделить всё
$ defaults domains | tr ',' '\n' | grep -i finder
com.apple.finder
Код: Выделить всё
$ defaults find AppleShowAllExtensions
Found 1 keys in domain 'Apple Global Domain': {
AppleShowAllExtensions = 1;
}
defaults write: ключевой инструмент админа
Запись - это то, ради чего все затевалось. Синтаксис: defaults write домен ключ -тип значение. Тип указывать обязательно по-хорошему, иначе угадает defaults и может угадать неверно. Доступные типы: -string, -int (integer), -float, -bool (true/false/yes/no), -date, -array, -dict, -data.
Классика - показать все расширения файлов в Finder (глобальный ключ, булев):
Код: Выделить всё
$ defaults write NSGlobalDomain AppleShowAllExtensions -bool true
Код: Выделить всё
$ defaults write com.apple.dock tilesize -int 36
Код: Выделить всё
$ defaults write NSGlobalDomain KeyRepeat -int 2
$ defaults write NSGlobalDomain InitialKeyRepeat -int 15
Для Dock и Finder это делается через killall - демон перезапустится автоматически (его держит launchd):Записал defaults - перезапусти того, кто эти настройки потребляет.
Код: Выделить всё
$ killall Dock
$ killall Finder
Код: Выделить всё
$ killall cfprefsd
Удаление возвращает ключ к дефолту (то есть удаляет твое переопределение):
Код: Выделить всё
$ defaults delete com.apple.dock tilesize
Один и тот же ключ может жить в разных областях, и это путает новичков. Разберем три уровня для настройки macos.
Обычная запись (без флагов) идет в ~/Library/Preferences/ - настройка пользователя, общая для всех его машин (если у тебя iCloud-аккаунт на нескольких Mac, но синхронизации plist через iCloud нет, так что на практике - просто домашний preferences).
Флаг -currentHost привязывает настройку к ЭТОЙ физической машине. Файл уходит в ~/Library/Preferences/ByHost/ с Hardware UUID в имени. Так хранятся, например, настройки заставки и некоторые параметры экрана:
Код: Выделить всё
$ defaults -currentHost write com.apple.screensaver idleTime -int 600
$ ls ~/Library/Preferences/ByHost/ | grep screensaver
com.apple.screensaver.A1B2C3D4-....plist
Флаг -g (синонимы -globalDomain, NSGlobalDomain) - это глобальный домен, про который говорили выше. Пиши туда то, что должно влиять на все приложения сразу.
plutil: конвертация, проверка, точечная правка
defaults хорош для пар ключ-значение, но когда нужно посмотреть целый plist mac в человеческом виде или починить битый файл - берем plutil.
Проверить, что файл не поврежден (lint - линтер для plist):
Код: Выделить всё
$ plutil -lint ~/Library/Preferences/com.apple.dock.plist
/Users/you/Library/Preferences/com.apple.dock.plist: OK
Конвертация бинарного plist в читаемый XML на лету в stdout (исходник не трогаем, -o - значит вывод):
Код: Выделить всё
$ plutil -convert xml1 -o - ~/Library/Preferences/com.apple.dock.plist
Код: Выделить всё
$ plutil -convert binary1 mydock.plist
Код: Выделить всё
$ plutil -extract tilesize raw ~/Library/Preferences/com.apple.dock.plist
48
Собираем все в один файл - это и есть основная ценность для админа. Такой скрипт прогоняется на свежей машине и за секунды приводит ее к твоему стандарту. Кусок реального macos.sh:
Код: Выделить всё
#!/bin/zsh
set -euo pipefail
# Finder: показывать расширения и скрытые файлы, путь в заголовке
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
defaults write com.apple.finder AppleShowAllFiles -bool true
defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf" # искать в текущей папке
# Dock: компактный, без недавних, автоскрытие
defaults write com.apple.dock tilesize -int 36
defaults write com.apple.dock show-recents -bool false
defaults write com.apple.dock autohide -bool true
defaults write com.apple.dock autohide-delay -float 0
# Клавиатура: быстрый повтор, без автозамены кавычек/тире
defaults write NSGlobalDomain KeyRepeat -int 2
defaults write NSGlobalDomain InitialKeyRepeat -int 15
defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
# Скриншоты в PNG в отдельную папку
defaults write com.apple.screencapture type -string "png"
defaults write com.apple.screencapture location -string "${HOME}/Screenshots"
mkdir -p "${HOME}/Screenshots"
# Применяем
killall Dock
killall Finder
killall SystemUIServer
echo "Done. Some keyboard settings need a logout to fully apply."
- set -euo pipefail - скрипт падает при первой ошибке, а не молча едет дальше с кривым состоянием.
- Часть глобальных настроек (особенно клавиатура) полностью применяется только после logout/login или перезагрузки - killall тут не помогает, перезапускать нужно пользовательскую сессию.
- Перед раскаткой проверь имена ключей на СВОЕЙ версии macOS: меняй настройку в GUI и смотри diff через defaults read до и после. Ключи иногда переименовывают между релизами.
Код: Выделить всё
$ defaults read com.apple.dock > /tmp/before.txt
# ... меняешь галочку в Системных настройках ...
$ defaults read com.apple.dock > /tmp/after.txt
$ diff /tmp/before.txt /tmp/after.txt
< autohide = 0;
> autohide = 1;
Парк машин: профили конфигурации вместо скриптов
Скрипт на defaults - отличное решение для одной-двух машин или личной настройки. Но для парка из 50+ Mac у него есть слабости: он применяется один раз, пользователь может все отменить обратно, и нет централизованного контроля. Тут вступают профили конфигурации (.mobileconfig) - и это стандарт управления Mac в 2026.
Профиль конфигурации - это XML-plist с расширением .mobileconfig. Внутри top-level словарь с метаданными (идентификатор, UUID, организация) и массив payload-ов; каждый payload настраивает свою подсистему. MDM раздает профиль на машины, и настройки из него ложатся в /Library/Managed Preferences/. Ключевое отличие от defaults: эти настройки УПРАВЛЯЕМЫЕ - они имеют приоритет над пользовательскими, и юзер не может их перебить через GUI (галочка часто становится серой). Снес профиль - снялась и настройка.
В современном MDM поверх этого работает Declarative Device Management (DDM) - модель, где устройство само применяет и поддерживает декларации состояния, а не ждет команд от сервера. В 2026 это магистральный подход Apple для управления настройками парка.
Грубое правило выбора:
- defaults-скрипт - личная машина, dev-окружение, разовая настройка, то что юзер вправе менять дальше сам.
- Профиль конфигурации / MDM - корпоративный парк, политики безопасности, то что должно быть зафиксировано и не отменяемо пользователем.
Сделай руками, по шагам - так уляжется:
- 1. Сними дамп: defaults read com.apple.dock > /tmp/before.txt
- 2. Поменяй размер Dock из CLI: defaults write com.apple.dock tilesize -int 24, затем killall Dock. Глянь, что иконки уменьшились.
- 3. Проверь тип: defaults read-type com.apple.dock tilesize - должно быть integer.
- 4. Через GUI верни Dock в нормальный размер ползунком, сними второй дамп и сделай diff с before - найди, какой именно ключ изменился.
- 5. Сконвертируй plist Dock в XML и посмотри глазами: plutil -convert xml1 -o - ~/Library/Preferences/com.apple.dock.plist | head -40
- 6. Удали свое переопределение: defaults delete com.apple.dock tilesize, killall Dock - вернулся дефолт.
- 1. Ты выполнил defaults write com.apple.dock autohide -bool true, но Dock не скрывается. Чего не хватает и почему?
- 2. В чем разница между записью без флагов, с -currentHost и с -g? В какие файлы они пишут?
- 3. Зачем нужен plutil -lint и что делать, если он вернул ошибку, а не OK?
- 4. Почему для парка из 80 Mac профиль конфигурации лучше, чем defaults-скрипт, хотя оба меняют те же plist?
Системные настройки macOS - это GUI поверх системы user defaults, то есть поверх plist-файлов в ~/Library/Preferences и /Library/Preferences. Инструмент админа - defaults (read/read-type/write/delete/find), с пониманием доменов, типов и областей (-currentHost, -g). Помни про cfprefsd и обязательный killall Dock/Finder после записи. plutil чинит и конвертирует plist. Один defaults-скрипт превращает ручную настройку Mac в воспроизводимый код, а для парка машин эстафету принимают профили конфигурации и DDM. Дальше галочки мышкой - только для исследования ключей, а не для работы.