Автоматизация: Shortcuts, AppleScript и osascript

Рейтинг: 70.2% · 15 голосов
Подробный курс по 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

Автоматизация: Shortcuts, AppleScript и osascript

Сообщение 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 как у профи + куда расти
Ты ловишь себя на том, что десятый раз за день делаешь руками одну и ту же цепочку: конвертнул кучу скриншотов в JPEG, переименовал по шаблону, закинул в нужную папку, дернул уведомление в Slack. На Linux ты бы написал bash-однострочник и забыл. На macOS все интереснее: тут есть целая фабрика автоматизации поверх Apple Events, визуальный конструктор Shortcuts, классика в виде AppleScript и мост в shell. И вопрос не "чем", а "чем именно под эту задачу", потому что инструментов реально много и они перекрываются.

Этот урок - про автоматизацию mac по-взрослому. Разберем, как устроены Apple Events (фундамент, на котором стоит почти все), чем shortcuts mac отличается от applescript, как запускать все это из терминала через osascript и shortcuts run, где доживает свой век automator, и когда вместо всего этого стоит взять Hammerspoon. Без магии: будем смотреть на команды и на их вывод.

Apple Events - фундамент, который ты не видишь

Прежде чем трогать инструменты, пойми механику. Почти вся автоматизация приложений на macOS - это Apple Events: межпроцессные сообщения, которыми один процесс просит другой что-то сделать. Когда ты пишешь "tell Finder to ..." - под капотом твой скрипт шлет Apple Event процессу Finder, тот его исполняет и возвращает результат. Это работает потому, что приложение опубликовало словарь (dictionary) - описание объектов и команд, которые оно понимает: у Finder есть files, folders, windows; у Mail - messages, accounts.

Над этим механизмом лежит OSA (Open Scripting Architecture) - абстракция, которая позволяет писать скрипты на разных языках, но слать одни и те же Apple Events. Реальных OSA-языков два: AppleScript (родной, с английскоподобным синтаксисом) и JavaScript for Automation, он же JXA (JavaScript, добавлен в OS X Yosemite). Оба компилируются в одни и те же события.

Ключевой момент 2026 года - безопасность. Apple Events между приложениями контролирует TCC (тот самый фреймворк приватности из урока про разрешения). Первый раз, когда твой скрипт обращается к чужому приложению, система спросит разрешение - "Терминал хочет управлять Finder". Без согласия прилетит ошибка -1743 (errAEEventNotPermitted). Это первая грабля любого, кто переносит скрипты на свежую машину или гоняет их по SSH.

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

$ osascript -e 'tell application "Finder" to get name of home'
# при первом запуске - системный запрос разрешения;
# если отказать или запускать без сессии (ssh):
# execution error: Not authorized to send Apple events to Finder. (-1743)
Посмотреть и сбросить выданные разрешения автоматизации можно через tccutil (полный сброс категории - tccutil reset AppleEvents), но точечно по приложениям проще через Системные настройки -> Конфиденциальность и безопасность -> Автоматизация.

Изображение

osascript: AppleScript и JXA прямо из терминала

osascript - это твой мост из shell в мир OSA. Он умеет два режима: инлайн через -e и запуск файла-скрипта. Язык переключается флагом -l (по умолчанию AppleScript).

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

# инлайн AppleScript: уведомление и диалог
$ osascript -e 'display notification "Бэкап готов" with title "Cron"'

# несколько -e склеиваются построчно
$ osascript -e 'tell application "Music"' -e 'get name of current track' -e 'end tell'
Mind Cycle

# то же самое на JXA (-l JavaScript)
$ osascript -l JavaScript -e 'Application("Music").currentTrack.name()'
Mind Cycle
Разбор вывода: osascript печатает результат последнего выражения в stdout. Это критично для shell-конвейеров - ты можешь подставлять результат AppleScript в переменную bash. Строки печатаются без кавычек, списки AppleScript - через запятую, что иногда ломает парсинг (об этом ниже).

Файловый скрипт удобно сделать исполняемым через шебанг - тогда он запускается как обычная команда:

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

#!/usr/bin/osascript -l JavaScript
const app = Application.currentApplication();
app.includeStandardAdditions = true;
app.displayNotification("Сборка прошла", { withTitle: "CI" });
AppleScript vs JXA - что выбрать. AppleScript читается почти как английский и его примеров в сети в разы больше; почти все рецепты автоматизации Mail, Finder, Music исторически на нем. JXA - это нормальный JavaScript: переменные, функции, JSON, нет адского AppleScript-синтаксиса для словарей. Минус JXA - он менее обкатан, в редких приложениях криво работает доступ к свойствам, и комьюнити меньше. Практичный совет: для коротких склеек приложений бери AppleScript (меньше сюрпризов), для логики с данными, JSON и циклами - JXA.

Сочетание с shell: do shell script и обратно

Главная сила в том, что мосты двусторонние. Из AppleScript ты вызываешь shell командой do shell script, а из shell дергаешь AppleScript через osascript. Это позволяет докинуть в GUI-автоматизацию любую утилиту BSD или Homebrew.

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

$ osascript -e 'do shell script "df -h / | tail -1 | awk \"{print \\$5}\""'
73%
Тут видно главную боль: do shell script принимает одну строку, и каждый уровень кавычек надо экранировать. Когда ты запускаешь это еще и из osascript -e, кавычек становится три слоя. Реальный рабочий прием - не громоздить, а вынести логику в отдельный .sh-файл, а из AppleScript звать только его путь.

Два важных нюанса do shell script:
  • Окружение урезанное. Это не твой интерактивный zsh - тут нет ~/.zshrc, PATH минимальный (/usr/bin:/bin:/usr/sbin:/sbin). Поэтому brew или другие команды из /opt/homebrew не найдутся: пиши полный путь /opt/homebrew/bin/brew.
  • Привилегии. do shell script "..." with administrator privileges поднимет графический запрос пароля и выполнит команду под root. Удобно для разовых вещей, но пароль в скрипте открытым текстом - это дыра, для фоновых задач используй launchd с нужными правами, а не зашитый пароль.
Shortcuts: современный путь автоматизации mac в 2026

Команды (Shortcuts) - это то, куда Apple вкладывается сейчас. Визуальный конструктор: собираешь цепочку действий блоками, без кода. Главный плюс перед AppleScript - кросс-Apple: один и тот же shortcut работает на Mac, iPhone, iPad и синхронизируется через iCloud. Действия покрывают файлы, приложения, систему, сеть, текст, и - что важно для нас - есть действие "Запустить скрипт" (shell, AppleScript, JXA) прямо внутри shortcut. То есть Shortcuts не заменяет AppleScript, а оборачивает его в удобный, синхронизируемый, запускаемый отовсюду контейнер.

И самое вкусное для сисадмина: с macOS есть CLI-утилита shortcuts. Это превращает визуальные сценарии в обычные команды для launchd, Makefile или CI.

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

# список всех команд
$ shortcuts list
Combine Images
Resize to 1080
Daily Report

# запуск по имени (пробелы - в кавычках или с экранированием)
$ shortcuts run "Combine Images"

# подать файлы на вход и забрать результат
$ shortcuts run "Resize to 1080" -i ~/Desktop/raw.png -o ~/Desktop/out.png

# пачка по маске на вход
$ shortcuts run "Combine Images" -i ~/Desktop/*.jpg
Разбор: shortcuts list - единственная подкоманда, которая работает чисто в терминале и ничего не открывает. А вот run, view и sign при выполнении на маке поднимают GUI-приложение Shortcuts. Флаги -i/--input-path и -o/--output-path - это твой stdin/stdout для shortcut: подал пути, забрал результат. Текст на вход можно отдать и через пайп. Это и есть актуальный путь: тяжелую логику собираешь мышкой в конструкторе, а триггеришь из скрипта через shortcuts run.

Когда Shortcuts проигрывает. Отладка скудная - нет нормального дебага, ошибка часто выглядит как "что-то пошло не так". Версионирование плохое: shortcut - это бинарный подписанный пакет, в git его не положишь по-человечески. И запуск по SSH без графической сессии часто спотыкается. Поэтому для серверных и headless-сценариев чистый AppleScript/osascript или shell остаются надежнее.

Automator: легаси, которое еще кормит, и Hammerspoon для тяжелого

Automator жив, но заморожен. Apple его не развивает: библиотека действий не растет, интерфейс не меняется с незапамятных времен, новых типов воркфлоу не появляется. Формально не deprecated, старые воркфлоу работают, но строить новое на нем - значит вкладываться в тупиковую ветку. Один кейс, где он еще полезен прямо сейчас:
  • Быстрые действия (Quick Actions) - пункты в контекстном меню Finder и в Сервисах. Хотя то же самое уже умеет Shortcuts, и Apple туда мигрирует.
  • Действия папки (Folder Actions) - триггер на появление файла в папке. Это нативный аналог inotify/watch, без сторонних утилит.
Практичный вывод: новое делай в Shortcuts, старые .workflow не трогай, если работают.

Когда же ни Shortcuts, ни AppleScript не хватает - заходит Hammerspoon. Это десктоп-автоматизация на Lua: мост в низкоуровневые API macOS - окна, экраны, мышь, клавиатура, системные события. Ставится через brew install hammerspoon --cask, конфиг живет в ~/.hammerspoon/init.lua. Его убойная фича - оконный менеджмент и глобальные хоткеи, чего стоковая система толком не дает.

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

-- ~/.hammerspoon/init.lua : Cmd+Alt+Left двигает окно в левую половину
hs.hotkey.bind({"cmd", "alt"}, "Left", function()
  local win = hs.window.focusedWindow()
  local f = win:screen():frame()
  win:setFrame({x=f.x, y=f.y, w=f.w/2, h=f.h})
end)
Hammerspoon берут, когда нужно реагировать на события системы (сменился Wi-Fi, подключился монитор, разрядка), тайлить окна по хоткеям, ловить глобальные сочетания клавиш. Это уже не "склеить два приложения", а полноценный программируемый слой поверх рабочего стола. Цена - это сторонний инструмент с TCC-доступом к Универсальному доступу (Accessibility), что для парка машин надо осознанно разрешать через MDM.

Типичные грабли
  • Ошибка -1743 и запросы автоматизации. Скрипт, работавший локально, по SSH или из launchd-демона падает: нет графической сессии для запроса разрешения TCC. Решение - выдать доступ заранее в Системных настройках, либо разворачивать PPPC-профиль через MDM.
  • PATH в do shell script. Не находит brew/python - потому что окружение урезано. Всегда полный путь: /opt/homebrew/bin/... на Apple Silicon, /usr/local/bin/... на старых Intel.
  • Кавычки слоями. osascript -e 'do shell script "..."' - три уровня экранирования. Не мучайся: выноси shell в отдельный файл.
  • shortcuts run открывает GUI. Ждешь тихого фонового выполнения, а вылезает приложение. Помни: чисто headless из подкоманд только list; run на маке поднимает интерфейс и требует залогиненной сессии.
  • Парсинг результата AppleScript. Список из AppleScript печатается как "a, b, c" - это не CSV и не JSON. Для машинной обработки бери JXA и возвращай JSON.stringify(...), парси через jq.
  • Названия приложений. "tell application" хочет точное имя бандла как в /Applications. System Settings в коде по-прежнему откликается на старое имя в ряде скриптов - сверяйся со словарем приложения.
Мини-лаба: собери свой пайплайн (10 минут)
  • Запусти osascript -e 'display notification "тест" with title "lab"' - убедись, что баннер прилетел.
  • Сравни два мира: osascript -e 'tell application "Finder" to get name of home' и osascript -l JavaScript -e 'Application("Finder").home.name()'. Прими запрос автоматизации, посмотри одинаковый ли результат.
  • Через do shell script вытащи системные данные: osascript -e 'do shell script "sw_vers -productVersion"'. Должна вернуться 26.x (Tahoe).
  • Сломай и почини PATH: osascript -e 'do shell script "brew --version"' (упадет), потом замени на полный путь /opt/homebrew/bin/brew --version.
  • Открой приложение Команды, собери shortcut из одного действия "Получить текущую дату" -> "Показать уведомление". Запусти его из терминала: shortcuts list, затем shortcuts run "имя".
  • Положи JXA-скрипт с шебангом #!/usr/bin/osascript -l JavaScript в файл, chmod +x, запусти как ./script.
Контрольные вопросы
  • Что такое Apple Events и при чем тут TCC, когда твой скрипт первый раз обращается к Finder?
  • Чем shortcuts run принципиально отличается по применимости от osascript при запуске по SSH без графической сессии?
  • Почему do shell script "brew install ..." падает с "command not found", и как это чинится одной правкой?
  • В каком случае ты возьмешь Hammerspoon, а не Shortcuts или AppleScript?
Итог

Под капотом всей автоматизации mac лежат Apple Events и OSA - на них стоят AppleScript (классика, надежно, тонна примеров) и JXA (JavaScript, удобный для данных). osascript - твой вход из терминала, do shell script - выход в shell, и оба моста двусторонние. Shortcuts - современный, кросс-Apple, синхронизируемый слой, который оборачивает все это и запускается из CLI через shortcuts run; именно сюда стоит вкладывать новое. Automator оставь легаси-воркфлоу, а Hammerspoon бери, когда нужен программируемый контроль над окнами и системными событиями. Выбор простой: склеить приложения - AppleScript/JXA, собрать переносимый сценарий с триггером из скрипта - Shortcuts, рулить рабочим столом - Hammerspoon.
👍 ❤️3 🔥1 😄 🤔1
Аватара пользователя
veteran_timur
Сообщения: 1
Зарегистрирован: 15 май 2026, 15:27

Re: Автоматизация: Shortcuts, AppleScript и osascript

Сообщение veteran_timur »

Не догонял разницу между Shortcuts и AppleScript, думал одно дублирует другое. После урока встало на место: shortcuts run триггерит сценарий из CI, а тяжелую логику с приложениями все равно тащит AppleScript внутри. Спасибо за CLI-флаги -i -o, искал их по форумам.
👍1 ❤️1 🔥1 😄 🤔1
Аватара пользователя
tor_pro
Сообщения: 1
Зарегистрирован: 18 май 2026, 02:02

Re: Автоматизация: Shortcuts, AppleScript и osascript

Сообщение tor_pro »

А ловушку с -1743 подтверждаю на своей шкуре: гонял osascript по ssh на парк маков из launchd, везде падало. Помог только PPPC-профиль через MDM, руками в Конфиденциальности на 60 машинах не накликаешься. Может, отдельным уроком разберете деплой таких разрешений?
👍 ❤️1 🔥 😄 🤔1
Ответить
← Предыдущая глава
Свои службы и периодические задачи на launchd
Следующая глава →
Конфигурация как код: defaults, plist и профили

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: Автоматизация на macOS

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

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

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