UNIX-команды macOS, которых нет в Linux: от say и defaults до sysadminctl

от автора

UNIX-команды macOS, которые ставят в тупик тех, кто пришел с Linux

UNIX-команды macOS, которые ставят в тупик тех, кто пришел с Linux

macOS — сертифицированная UNIX система (формально — UNIX 03), и большая часть того, что набираешь в терминале, ведет себя, как в любом BSD: ls, grep, ps, ssh — все на месте. Но рядом лежит второй слой команд, которого нет ни в одном дистрибутиве Linux и нет в POSIX: defaults, sysadminctl, mdfind, say, afplay

Часть из них выросла из архитектуры Darwin, часть — из графической и звуковой подсистем, а часть существует исключительно ради управления экосистемой Apple.

Таких утилит в macOS не один десяток, а в статье мы разобрали самые интересные и востребованные, по критериям: команда входит в macOS по умолчанию, не имеет штатного аналога в Linux и создавалась под задачи экосистемы Apple.

Откуда растут ноги: BSD, а не GNU

macOS построена на базе операционной системы Darwin, которая сочетает в себе микроядро Mach и ядро BSD. Darwin был выпущен еще в 2000 году, и именно оттуда в систему попал BSD -userland, а не GNU coreutils. Отсюда все привычные грабли: у BSD-версий sed, ls, date ключи отличаются от тех, что у GNU. А поверх этой BSD-базы Apple десятилетиями наслаивала собственные утилиты, многие из них — наследие NeXTSTEP. Как раз о них и речь. Кому интересно, как система дошла до такой архитектуры, у нас есть отдельный разбор эволюции ОС Apple от NeXTSTEP до современной macOS.

say

Что делает. Превращает текст в речь и либо проговаривает его через аудиовыход, либо пишет в файл: say "build finished".

Почему появилась. Синтез речи встроен в macOS как часть системы Accessibility → Speech (Универсальный доступ → Проговаривание текста), тем же движком озвучивается интерфейс для незрячих. say — это просто обертка командной строки (Command Line Interface — CLI) над системным синтезатором.

Пример. say -v '?' покажет список голосов (Alex, Samantha, русская Milena и десятки других), say -v Milena "Привет" выберет конкретный. Вывод можно писать в файл: say "готово" -o done.aiff. Классика жанра — озвучить окончание долгой задачи: make && say "done". Особенно весело звучит хор таких “Done”, когда настраиваешь скриптом сразу парк машин.

Чем отличается от Linux. В базовой системе Linux штатного TTS (Text To Speech) нет вообще. Аналоги ставятся пакетами: espeak/espeak-ng, festival, flite, обертка spd-say над Speech Dispatcher. Работают, но это всегда сторонний софт, а не часть ОС.

Интересный факт. Синтез речи в маках восходит к 1984 году: на презентации первого Macintosh компьютер сам произнес приветствие со сцены. Голос Fred, доживший до современных версий, по легенде основан на сэмпле одного из членов оригинальной команды Macintosh.

afplay

Что делает. Проигрывает аудиофайл прямо из терминала: afplay alert.wav. Расшифровывается как Audio File Play.

Почему появилась. Это CLI-надстройка над аудиостеком macOS (CoreAudio). Систему звука Apple унифицировала, поэтому одна утилита играет все — aiff, m4a, mp3, wav, flac.

Пример. afplay --rate 2 track.mp3 ускорит воспроизведение вдвое, afplay --time 5 track.mp3 проиграет первые пять секунд. Рядом живут afinfo (метаданные файла) и afconvert (конвертация).

Чем отличается от Linux. В Linux нет единого проигрывателя такого уровня: aplay — часть Advanced Linux Sound Architecture и работает через ядро-драйверы, paplay/pacat — клиенты PulseAudio, есть еще PipeWire. То есть команда завязана на конкретную звуковую подсистему, тогда как afplay всегда идет через один CoreAudio.

open

Что делает. Открывает файл, папку, URL или приложение так, будто вы дважды кликнули по нему в Finder в ассоциированной по типу программе. open report.pdf откроет PDF в дефолтном просмотровщике.

Почему появилась. Это мост между CLI и графической оболочкой: open запрашивает Launch Services — ту же подсистему, что решает, каким приложением открывать тип файла при двойном клике. Без него из терминала не «пробросить» файл в GUI-приложение штатным способом.

Пример.  open . откроет текущую папку в Finder, open https://habr.com — ссылку в браузере, open -R ~/file.log покажет файл в Finder (R — reveal), open -e notes.txt откроет файл именно в TextEdit.

Чем отличается от Linux. Прямой аналог — xdg-open из пакета xdg-utils (freedesktop). Логика та же: открыть в приложении по умолчанию, но xdg-open тоже не всегда есть в базовой системе и работает в рамках desktop-сессии, опираясь на MIME-ассоциации, а не на Launch Services.

defaults

Что делает. Читает и пишет настройки приложений и системы, которые хранятся в plist-файлах. Настройки разложены по доменам: defaults read com.apple.finder, defaults write com.apple.dock autohide -bool true.

Почему появилась. В macOS настройки — это не разрозненные dot-файлы, а централизованная система preferences (CFPreferences/NSUserDefaults) с доменами и типами данных. defaults — консольный интерфейс к ней. Утилита пришла еще из NeXTSTEP, где само слово «defaults» и означало пользовательские настройки.

Пример. defaults write NSGlobalDomain AppleShowAllExtensions -bool true — показывает все расширения файлов. После записи приложение обычно надо перезапустить (killall Finder), чтобы оно перечитало значение. К слову, через defaults (в связке с softwareupdate) удобно управлять и поведением апдейтов, мы подробно разбирали это в статье о том, как устроены обновления macOS.

Чем отличается от Linux. В Linux нет единого системного реестра настроек. Ближайший аналог — dconf/gsettings, но это стек GNOME; KDE использует свой KConfig, а масса приложений — обычные текстовые конфиги. Общего для всей ОС «defaults» в Linux не существует.

Интересный факт. Сам формат plist — тоже наследие NeXTSTEP. В Mac OS X текстовый формат уступил место XML, а с версии 10.2 появился бинарный plist, ставший форматом по умолчанию.

sysadminctl

Что делает. Администрирует локальные учетки из CLI: создание, удаление, смена паролей  и, что ценят Apple-админы, управление статусом Secure Token.

Почему появилась. Apple добавила sysadminctl ещё в OS X 10.10 (2014) как современную CLI-замену древнего dscl для работы с учетными записями. К High Sierra (10.13, 2017) она стала рекомендуемым инструментом для управления пользователями из командной строки. А управление Secure Token появилось в нейё позже вместе с APFS (файловая система Apple). Этот атрибут файловой системы решает, кто может разблокировать FileVault, а sysadminctl оказался тем местом, куда Apple поместила работу с ним.

Пример. sysadminctl -addUser john -fullName "John" -password — создаст пользователя, а sudo sysadminctl -secureTokenOn john -password userpw -adminUser admin -adminPassword adminpw выдаст ему Secure Token. Обратите внимание: операция всегда требует учетки существующего администратора с токеном.

Чем отличается от Linux. Аналоги — useradd/userdel/passwd, но в Linux нет концепции Secure Token. Шифрование диска (LUKS/cryptsetup) не привязано к атрибуту учетки: том открывается парольной фразой или ключом, а не токеном конкретного пользователя. Модель, где право разблокировать FDE (Full-Disk Encryption) закреплено за пользователем, специфична для APFS. Подробно эту механику мы разбирали в материале про Secure Token и Bootstrap Token, а ее роль в шифровании — в статье про устройство FileVault.

Интересный факт. sysadminctl не позволит удалить последнего администратора или последнего владельца Secure Token , так утилита защищает Mac от окирпичивания.

Почему defaults и PlistBuddy — это не одно и то же

Самый частый источник багов в скриптах для мака. Оба инструмента вроде бы «правят plist», но делают это на разных уровнях. Настройки в macOS — это слоеный пирог: API (NSUserDefaults/CFPreferences) → демон-кэш → файл на диске.

defaults работает через демон cfprefsd: он держит настройки в кэше в памяти, знает, где именно лежит активный файл (в /Library/Preferences, ~/Library/Preferences или их ByHost-подпапках), и рассылает уведомления об изменениях. PlistBuddy (лежит по пути /usr/libexec/PlistBuddy) правит файл на диске напрямую как структуру данных, ничего не зная про кэш.

Отсюда главная грабля: если PlistBuddy изменит plist домена настроек, пока cfprefsd держит его в кэше, ваша правка может быть просто затерта — демон запишет закэшированные значения поверх файла.

Поэтому правило простое: для доменов настроек — defaults (или, если очень надо PlistBuddy, следом запускать killall -u $USER cfprefsd, чтобы сбросить кэш). А PlistBuddy незаменим там, где никакого cfprefsd в цепочке нет: Info.plist, plist демонов LaunchDaemon/LaunchAgent, файлы на не загруженном томе. Кстати, сама man-страница defaults предупреждает не использовать его для произвольного редактирования plist — для этого есть plutil и PlistBuddy.

Почему command not found: PlistBuddy. Каталог /usr/libexec не входит в пользовательский $PATH, поэтому shell не находит утилиту только по имени — вызывайте ее полным путем: /usr/libexec/PlistBuddy -c "Print" file.plist. Если работаете с ней часто, допишите каталог в PATH в ~/.zshrc: export PATH="$PATH:/usr/libexec".

После source ~/.zshrc команда PlistBuddy заработает без пути. Тот же прием, кстати, открывает и другие служебные бинарники из /usr/libexec.

Команды, которые оценят MDM-инженеры

Отдельная группа утилит, которые линуксоид не встретит нигде, потому что они завязаны на модели управления устройствами Apple.

profiles

Управление конфигурационными профилями (.mobileconfig). Здесь важнейший нюанс, на котором спотыкаются мигрирующие со старых гайдов: начиная с macOS 11 Big Sur команда больше не умеет устанавливать профили из CLI. profiles install мертв для локального запуска — Apple убрала это ради безопасности. Что осталось рабочим: profiles list (список установленных), profiles status -type enrollment (MDM-статус, показывает флаг User Approved), profiles renew -type enrollment (обновление enrollment), profiles remove. Установка профилей теперь идет либо через MDM «тихо» на устройство с одобренным enrollment, либо вручную пользователем в System Settings.

systemextensionsctl

Инспекция и управление системными расширениями — user-space заменой kernel extensions (kext), которую Apple продвигает с macOS Catalina. systemextensionsctl list покажет установленные расширения и их состояния (activated enabled, activated waiting for user), systemextensionsctl developer on включит режим разработчика. Концептуально ближайший родич в Linux — работа с модулями ядра (lsmod/modprobe), но модель с подписью и одобрением пользователем/MDM чисто маковская.

tccutil

Работа с базой приватности TCC (Transparency, Consent, and Control), где хранятся решения о доступе приложений к камере, микрофону, диску, записи экрана. Критично понимать: tccutil умеет только сбрасывать разрешения, но не выдавать. tccutil reset Camera или sudo tccutil reset ScreenCapture com.google.Chrome обнулят решения, и система снова спросит пользователя. Выдать доступ можно только явным согласием пользователя или PPPC-профилем через MDM, причем камеру и микрофон даже MDM не может разрешить удаленно. Типовой сценарий reset — починка залипших разрешений после обновления приложения. Как эта система приватности вообще появилась и эволюционировала, мы разбирали в краткой истории защиты конфиденциальности на Mac.

security

CLI к keychain и Security framework. security find-certificate -a -p выгрузит сертификаты, security unlock-keychain login.keychain разблокирует связку, security add-trusted-cert добавит доверенный корневой сертификат в System.keychain. В Linux эта функциональность разнесена: секреты — в GNOME Keyring/KWallet через Secret Service API, доверенные CA — в системном trust store (update-ca-certificates). security собирает все это одной командой.

Что еще есть в арсенале: короткий список

Раздел факультативный , просто чтобы знать, что эти команды существуют и гуглить их по имени, когда понадобится. Все они Apple-специфичны и прямых двойников в Linux обычно не имеют:

  •  pbcopy / pbpaste — буфер обмена (pasteboard) из CLI в GUI: cat file | pbcopy, pbpaste > out.txt. В Linux роль играют xclip/xsel или wl-copy.

  • networksetup — конфигурация сети из терминала: Wi-Fi, DNS, прокси, сетевые сервисы.

  • scutil — System Configuration: изменить имя хоста (scutil --set HostName), показать или изменить сетевые настройки.

  • diskutil — управление дисками и томами: diskutil list, работа с APFS-контейнерами, форматирование, монтирование. Аналог связки lsblk/mount/parted.

  • caffeinate — не давать Mac засыпать: caffeinate -i ./long_job.sh удержит систему бодрствующей на время выполнения команды.

  • mdfind — поиск через индекс Spotlight из CLI: mdfind "МинВоды". Быстрее find, потому что идет по индексу метаданных, а не обходит ФС.

  • softwareupdate — обновления macOS из терминала: список, загрузка, установка. Незаменима в скриптах и MDM-сценариях (см. также разбор про обновления macOS).

  • spctl — управление политиками Gatekeeper: spctl --status покажет статус, оценка приложений и правил допуска к запуску.

  • system_profiler — полный отчет о железе и софте: system_profiler SPHardwareDataType. Машиночитаемый вывод удобно обрабатывать прискармливать инвентаризации.

Итог: собственный набор командных утилит Apple

За годы Apple обросла целым арсеналом собственных утилит командной строки — под звук, речь, настройки, шифрование, поиск, управление устройствами. Часть из них выглядит непривычно (defaults вместо редактирования конфиг-файлов), часть кажется избыточной (say в базовой поставке), но многие оказываются неожиданно удобными, особенно когда приходится администрировать парк маков, а не один ноутбук.

А какие «неочевидные» команды macOS выручали вас в скриптах и при разборе инцидентов? Особенно интересны находки тех, кто пришел с Linux, что показалось диким, а что в итоге прижилось. Делитесь в комментариях.

ссылка на оригинал статьи https://habr.com/ru/articles/1064572/