mac os создать скрипт
Консоль для маководов: Beyond the GUI
Доброго дня, уважаемые хабравчане-маководы!
Сегодня я расскажу как увеличить эффективность работы в Mac OS X за счёт использования консоли.
Лирическое отступление
Если Вы пришли из мира M$, то для начала неплохо бы поучить общие команды shell’а, например, по вот этому учебному пособию. Как минимум, нужно усвоить команды перехода по каталогам и способы запуска программ и скриптов.
Если Вы пришли в мир Mac OS из мира Linux’а и FreeBSD, то, скорее всего, знаете как минимум основы shell-скриптинга. Но и для вас в статье может оказаться кое-что интересное, ведь в маке есть уникальные консольные команды, которые так же полезно знать.
Вот о некоторых особенностях маковской консоли далее и пойдёт речь.
Начнём работу
Для начала избавимся от стандартного терминала. Ну, точнее, поставим другой — получше. Я лично предпочитаю iTerm2, который подходит для работы куда лучше системного. Хотя, и у него бывают интересные моменты (см. картинку вверху).
Далее нам могут понадобиться дополнительные инструменты, поэтому устанавливаем MacPorts (хотя, конечно, можно и другой менеджер пакетов). Теперь мы можем ставить нужные консольные утилиты с помощью простых команд. Например, ставим Midnight Commander (он в любом случае может пригодиться), набираем в iTerm2:
Ещё одно важное замечание: кури мануалы если что-то не понятно, набираем в консоли man команда — и получаем подробное описание команды. (Кстати, для выхода из просмотра мануала надо просто нажать Q).
Продолжаем знакомство с консолью. Команда open
И — опа! — скрытый файл открылся в TextEdit! Всё предельно просто.
Пара слов о бандлах
Способ первый, простейший:
Программа будет запущена и консоль будет свободна для дальнейших действий.
Способ второй, интересный:
Программа будет запущена, но консоль не освобидится — она будет ждать завершения программы и выводить всё, что программа захочет вывести в неё. То есть, таким образом можно посмотреть рабочий лог некоторых программ.
Ещё одно очень важное различие между этими двумя методами: второй позволяет запустить два экземпляра программы, в то время как первый активирует уже запущенную, буде такая имеется. Так что через консоль можно решить и эту проблему (хотя, скорее фичу) макоси: через Finder, док и лаунчер запустить два экземпляра программы нельзя, а вот из консоли — пожалуйста, хоть двадцать два.
Скрипт?
Пример простейший, но он демонстрирует главное: в скриптах сокрыта великая сила.
Скрипты AppleScript
Не буду углубляться в AppleScript, он заслуживает отдельной статьи, и даже не одной. Так что рекомендую почитать справку или гугл по нему.
Главное: Вы можете комбинировать shell-скрипты со скриптами AppleScript, чтобы добиться максимальной гибкости в работе! К примеру, я использую такие вот смешанные скрипты для автоматической стилизации образа диска: сам диск создаётся с помощью shell (см. ниже), а фон и расположение элементов в образе задаётся с помощью AppleScript.
Есть ещё Automator, но он совсем уж GUI-шный, так что в данной статье его рассматривать бессмысленно. Он, конечно, полезный, но до мощи консоли не дотягивает.
Кратко о других полезных командах Mac OS X
Полный (ну, почти) список уникальных для макоси команд можно найти в одной хорошей статье (хотя сведения там немного устарели), я же вкратце расскажу о наиболее интересных.
Одна беда — по-умолчанию говорит эта штука только по-английски.
Теперь снимем скриншот командой из консоли.
Так же textutil умеет преобразовывать кодировки.
Файндер автоматически перезапустится и теперь будет отображать скрытые файлы и папки! Но опять таки, это не всем нравится, так давайте это выключим, пока родителикто-нибудь не испугался или не удалил нужных файликов. Для сокрытия в уже указанной команде поставьте 0 вместо 1. Ну и для примера, ссылка на статью, где описано много твиков с помощью этой команды.
Что-то типа заключения
Ну что ж, мы разобрали некоторые интересные возможности консоли в Mac OS X. Статья, разумеется, не претендует на полноту и является, скорее, «заманухой» для вовлечения маководов в shell-скриптинг да и вообще в консоль.
Mac os создать скрипт
Developer
Mac Automation Scripting Guide
Creating a Script
Generally, most scripts are written in Script Editor documents. Scripts can also be written in Xcode, but this is typically for scripts that require advanced user interfaces.
Press Command-N or select File > New.
If the script isn’t configured for the correct language, choose the language in the navigation bar.
Write your script code in the editing area. Newly written code is uncompiled and formatted as new text.
Click the Compile button ( ) to compile the script and check for syntax errors.
If a syntax error occurs, an alert is displayed.
If the script compiles, code formatting is applied at this time.
Using an AppleScript Template
Script Editor includes a number of built-in templates for creating common types of AppleScripts, including droplets, Mail rule scripts, and Messages handler scripts.
Script Editor does not include JavaScript templates at this time.
Choose File > New from Template.
Select a script template.
A new Script Editor document window opens containing prewritten code and preconfigured settings. The following screenshot shows an example of a script created using a template.
Скриптинг для Mac OS X: начинаем программировать на AppleSсriрt
Содержание статьи
Из этой статьи ты узнаешь, что такое AppleScript, зачем и кому он нужен, как можно автоматизировать чужие приложения и добавлять возможность автоматизации в свои.
Автоматизируй это
Часто встречаются такие задачи, для решения которых делать отдельный проект на компилируемом языке нерационально. Например, когда нужно быстро слепить на коленке код, который должен просто выполнять конкретную работу — без всяких GUI-украшений, обработки всевозможных исключительных ситуаций, оптимизации и прочего. Здесь на помощь и приходят языки сценариев — известные тебе shell, Perl, PHP и так далее. Все они (ну или почти все) доступны и под Mac OS X. Но в этой операционке в дополнение к общепринятым скриптовым языкам есть и специальный язык сценариев, ориентированный именно на Mac OS X и тесно с ней связанный. Это AppleScript.
AppleScript идет вместе с системой начиная с System 7. Выросший из проекта HyperCard (который содержал скриптовый язык HyperTalk, очень похожий на естественный английский), AppleScript первоначально создавался для того, чтобы обеспечить обмен данными между задачами, а также для управления работой сторонних приложений. Сам по себе AppleScript обладает довольно скромной функциональностью: на этом языке даже сценарии для выполнения сравнительно простых задач часто выглядят как обращение к другим приложениям. Впрочем, после существенной перестройки системы при переходе к линейке Mac OS X язык AppleScript стал боле гибким и мощным, а новый фреймворк Cocoa позволил разработчикам встраивать в свои приложения возможность автоматизации с помощью AppleScript’а с минимальными усилиями.
Простой сценарий
Для редактирования и исполнения скриптов мы будем использовать стандартный Script Editor. Найти его можно в папке /Application/AppleScript. Для начала напишем простой «HelloWorld’ный» скрипт.
display alert «Hello World!» # Покажем диалог
say «Hello World» # Вывод в колонки
Объяснять тут, думаю, ничего не нужно, но хочется отметить крайне простой доступ к синтезатору речи из AppleScript c помощью команды say. Вот это и есть настоящее общение с пользователем в стиле Apple :). Конечно же, этот диалог можно легко кастомизировать. Например, добавить нужные кнопки:
Панель с дополнительными кнопками
display alert «Hello World!» buttons <"Hello", "Bye">
set answer to button returned of the result
if answer is «Hello» then
.
else
.
end if
Теперь напишем что-нибудь более полезное. Например, дадим пользователю выбрать файл и прочитаем его содержимое:
# Панель выбора файла
set theFile to (choose file with prompt «Select a file to read:» of type <"TEXT">)
open for access theFile
Читаем контент
set fileContents to (read theFile)
close access theFile
На этих примерах хорошо видна основная идея AppleScript — он очень близок к живому английскому языку. Поэтому читать скрипты легко даже для человека, далекого от кодинга. Каждая командаглагол может быть дополнена существительными-модификаторами и параметрами.
Взаимодействие c приложениями
Для взаимодействия с другими приложениями AppleScript использует механизм сообщений:
tell application «Microsoft Word»
quit
end tell
C помощью команды tell выбираем приложение, которому мы будем отправлять сообщение. В данном случае мы просим MS Word завершиться. В блоке «tell — end tell» может быть отправлено любое количество команд. Сообщения, которые отсылаются приложению, могут быть и более специфичными. Все зависит от того, какие команды реализовали его разработчики. iTunes, например, экспортирует довольно много команд и свойств в среду AppleScript:
Запускаем нужный плейлист в iTunes
tell application «iTunes»
play the playlist named «My Favorite»
end tell
Чтобы тебе было проще работать с классами и командами, которые экспортирует приложение, они организованы в разделы. Все приложения, которые поддерживают скриптинг, имеют хотя бы два раздела: один стандартный и один из более специфичных для данного приложения разделов. Стандартный раздел содержит набор стандартных команд, которые поддерживает любое Mac-приложение: open, print, close и quit. Содержание остальных разделов зависит от фантазии разработчиков.
Выполнение AppleScript из своего приложения
Если ты пишешь приложение на Objective-C/Cocoa, то возможно, что некоторые вещи будет удобнее сделать с помощью AppleScript. Для создания и выполнения в Cocoa-приложениях скриптов существует класс NSAppleScript. Вот простой пример его использования — реализация получения у приложения iChat строки статуса пользователя.
NSAppleScript *iChatGetStatusScript = nil;
iChatGetStatusScript = [[NSAppleScript alloc] initWithSource: @»tell application «iChat» to get status message»];
NSString *statusString = [[iChatGetStatusScript executeAndReturnError:&errorDict] stringValue];
Возможно, то же самое можно сделать и другим путем, не используя созданный во время выполнения скрипт, но вряд ли альтернативный код будет выглядеть проще, чем этот. Если скрипты большие, можно хранить их в ресурсах бандла и читать при необходимости.
Автоматизация в Cocoa-приложении
Содержимое файла scriptTermonology отображается в Script Editor’е при просмотре словаря приложения. Этот файл содержит описание экспортируемых в AppleScript объектов.
Открыв scriptSuite-файл в Plist Editor’е, можно видеть, что он содержит следующие основные разделы:
Разбирать внутреннее устройство этих файлов особого смысла нет, так как тебе скорее всего придется иметь дело только с sdef-файлами.
Пример sdef-файла
.
NSAppleScriptEnabled
Scrtipting.sdef
Добавим к проекту файл Scripting.sdef следующего содержания:
Итак, из AppleScript’а у нас доступно одно свойство — myprop. Осталось написать ObjC-код, который будет обрабатывать чтение данного свойства из скриптов. Для этого нужно создать категорию NSApplication, поскольку именно этот класс мы выбрали в качестве получателя сообщений от скриптов.
Eсли мы теперь из AppleScript обратимся к свойствам нашего приложения, то увидим среди них свое свойство и его значение:
tell application «Scripting»
properties
end tell
Заключение
Конечно, описать здесь все возможности AppleScript и его взаимодействия с Cocoa-приложениями невозможно. Да это и не нужно — для этого есть мануалы. А мы со своей стороны продолжим цикл статей о кодинге под эппловские платформы и расскажем тебе еще много нового и интересного.
Как в Mac OS самостоятельно создавать командные сценарии
Освоить символы шаблона очень легко. Например, представьте себе, что у вас возникла потребность просмотреть список всех файлов формата JPEG, хранящихся в текущей папке. Чтобы сделать это, достаточно дать одну-единственную команду в окне Terminal:
1$ grep Devanshu *.doc
Эта команда выведет список всех файлов, содержащих указанную строку (листинг ниже).
1234// Результат поиска файлов документов, содержащих указанную строкуBinary file BBoAH-04-Commandline.doc matchesBinary file BBoAH-06-Network-file.doc matchesBinary file BBoAH-14-Multimedia.doc matches
Grep — это программа, выполняющая поиск указанной строки по файлам. В действительности она использует довольно сложные комбинации символов, в том числе и символов шаблона, для описания искомой строки. Использование регулярных выражений (regular expressions) позволяет описывать искомые строки с использованием альтернативных символов, а также классов букв и цифр. Например, описание [sS]hell позволяет найти вхождения shell и Shell, а описание [a-z]+ дает возможность поиска любых последовательностей из одной или нескольких букв на нижнем регистре клавиатуры. Чтобы прочесть описание этой команды, введите из командной строки следующую команду: man grep.
При использовании комбинаций команд grep и find можно получить результаты, аналогичные тем, что выдает Spotlight, с тем лишь недостатком, что наилучшим образом данный метод работает с текстовыми файлами. Однако есть у данного метода и свое преимущество — оно заключается в том, что таким образом можно задавать гораздо более сложные искомые строки, нежели при работе через Spotlight. Вот пример использования команды find, результатом которого будет вывод списка всех файлов, содержащихся в текущем каталоге (включая файлы во вложенных каталога), содержащих упоминание каких-либо стандартов ISO:
Программа find производит сортировку по каталогам, выделяет файлы и передает их программе grep, которая ищет в них строку ISO, за которой следует одна или несколько цифр. Если вам кажется, что каждый раз вводить такую строку проблематично и неудобно, то вот вам хорошая новость. На самом деле делать это не обязательно. Я использую эту команду постоянно, но не ввожу ее с клавиатуры. Хотите знать, как это делается? Далее я расскажу, как этого добиться.
Переменные и псевдонимы
В среде оболочки есть два способа запоминания командных строк: псевдонимы (aliases) и переменные (variables). Псевдоним — это сокращенное имя команды, которая используется постоянно. Например, я создаю папки для хранения текстов книг, над которыми я работаю, и храню их в каталогах, которые сортируются по году выхода книг. Этот подход очень удобен, но постоянно вводить строки наподобие
/ tech/08/oreilly/applehacks/draft довольно неудобно. Поэтому я воспользовался следующей командой для создания псевдонима:
Теперь, если мне требуется перейти в каталог
Кроме того, оболочки позволяют определять переменные (variables), которые могут замещать любую часть команды. Дело в том, что при всем своем удобстве, псевдонимы имеют и некоторые ограничения. Например, для получения еще более гибких возможностей, я выполняю команды, приведенные в листинге.
123// Пример, иллюстрирующий использование переменных$ export WORK=
Теперь я могу ввести из командной строки следующую команду:
Набор переменных, которые вы используете постоянно, и называется вашим окружением или средой (environment). Чтобы просмотреть весь набор ваших переменных окружения, введите из командной строки следующую команду:
Переменные и псевдонимы предоставляют вам такой широкий набор возможностей, который ограничивается только вашим воображением и желанием потратить время на исследования, которые затем позволят вам создать для себя действительно удобную рабочую среду.
Командные сценарии
Я лентяй. Помните команду find, предназначенную для вывода всех файлов, содержащих упоминание стандартов ISO, приведенную чуть ранее в данном рецепте? И кто же захочет каждый раз вводить эту команду вручную? Может быть, кто-то и захочет, но уж точно не я. Да и вам это тоже делать не обязательно. Гораздо проще создать небольшой текстовый файл, выглядящий так, как показано в листинге.
Сохраните этот файл под именем, например, findfile, а затем введите следующую команду, назначение которой заключается в том, чтобы сообщить оболочке, что исполнение команд, содержащихся в этом файле, разрешено:
1$ chmod +x findfile
Теперь вы сможете выполнить следующую команду:
После того как я поместил мой файл findfile в этот каталог, я в любой момент могу запустить сценарий, введя из командной строки следующее:
Сложные сценарии с циклами и условными операторами
Замечательной возможностью командных сценариев является наличие возможностей, присущих языкам программирования, включая все основные функции управления ходом исполнения, которые можно было бы ожидать от языка программирования. В предыдущем подразделе мы уже рассмотрели, каким образом создаются переменные. В данном разделе мы рассмотрим циклы и условные операторы.
Представьте себе, что вы выполняете работу для компании, которая изменила свое название, и при этом должны отредактировать большое количество файлов формата XML с тем, чтобы изменить имя компании, которое встречается в каждом файле по нескольку раз. В моей практике такой случай был, причем файлов было около 120, поэтому перспектива поочередного ручного редактирования каждого из них меня не вдохновила. Поэтому я написал командный сценарий, показанный в листинге ниже.
Командный сценарий, приведенный в листинге 4.6, циклически обрабатывает все файлы, применяя к каждому из них команду sed. Команда sed — это еще одна исключительно полезная программа UNIX, с которой вам необходимо ознакомиться. Sed представляет собой неинтерактивный текстовый редактор, работающий из командной строки. В данном примере он применяется для выполнения простой программы замены, которая автоматически заменяет все вхождения строки oldName на строку NewName.
Sed (Stream EDitor) — это потоковый текстовый редактор, одновременно являющийся и языком программирования. Он применяет различные предопределенные текстовые преобразования к последовательному потоку текстовых данных (обычно файлу), редактирует каждую строку в соответствии с правилами, заданными в sed-скрипте, и выводит результат в выводной поток. Sed является настолько мощным средством, что заслуживает пристального изучения. Помимо man-страницы sed, рекомендуется посетить следующие страницы Википедии: http://en.wikipedia.org/wiki/Sed (англ.) и http://ru.wikipedia.org/wiki/Sed (рус.) и пройтись по приведенным там ссылкам.
Сценарий, приведенный в листинге выше, обрабатывает только файлы, в которых команда grep обнаружила строку OldName. Благодаря этому, редактированию подверглись только те файлы, которые в этом нуждались.
Итак, при работе с оболочкой вы можете пользоваться языком командных сценариев с переменными, циклами и условными утверждениями. Иными словами, у вас есть все, что необходимо для написания скриптов, позволяющих вам выполнить все, что требуется, и решить любую задачу. Это всего лишь краткое и поверхностное введение в оболочку bash и ее возможности.
По оболочке bash и предоставляемым ею возможностям программирования написаны отдельные большие книги. Есть и немало подробных руководств и книг по языкам командных сценариев, например, Perl и Python. Если вы хотите получить еще более мощные возможности, чем предоставляемые bash, то, скорее всего, сможете добиться своих целей с помощью этих языков.
Истинная мощь программирования с использованием языков командных сценариев заключается в том, чтобы заставить компьютер автоматически выполнять для вас рутинную работу, в то время как вы сами в это время можете делать что-то другое — например, выполнять более творческую работу, отдыхать, обедать и т. п. Теперь, когда вы знаете, как написать скрипт, давайте пойдем еще дальше и сделаем так, чтобы он даже запускался автоматически.
Mac OS X предоставляет целых четыре различных способа достижения этой цели — два старомодных, принятых в те годы, когда UNIX была еще очень молодой операционной системой, и два современных, более характерных для Mac.
Старомодные подходы
Если вы хотите, чтобы ваша программа автоматически запустилась в заданный момент времени в будущем и отработала только один раз, воспользуйтесь командой at. Создайте скрипт и назовите его, например, test.sh. Не называйте его просто test, поскольку это — встроенное имя, используемое оболочкой, и вы будете долго ломать голову, пытаясь понять, почему скрипт не работает. Если вы не можете придумать ничего творческого, воспользуйтесь примером, приведенным в листинге.
1234// Простой скрипт, используемый в качестве // примера для запуска по расписанию#!/bin/bashecho «hello» >>trash.txt
Не забудьте запустить команду chmod +x, указав в качестве аргумента имя нового файла:
Когда вы запускаете эту новую программу, она добавит строку hеllo в состав файла trash.txt. Теперь попробуйте запустить этот сценарий, дав, например, следующую команду:
1$ at –f test.sh 1735
После этого дождитесь, когда наступит 17:35, и посмотрите на файл trash.txt.
Вы хотите, чтобы ваш скрипт запускался регулярно? В этом случае пользуйтесь программой cron. Программа cron ищет файл и открывает для просмотра файл crontab, в котором указывается, какие операции должны быть выполнены автоматически в заданный момент времени. Чтобы настроить программу cron, вам необходимо создать файл crontab. Чтобы сделать это, дайте следующие команды из командной строки Terminal (листинг ниже).
В результате выполнения команды откроется сеанс редактирования при помощи редактора nano, причем возможно, что вы увидите экран редактора, отображающий пустой файл. Посмотрите на строку в нижней части экрана, чтобы ознакомиться со списком команд, которые вы можете использовать в nano.
Обратите внимание, что символ ^ означает нажатие клавиши Control, таким образом, обозначение ^G соответствует нажатию клавиатурной комбинации Ctrl+G.
Файл crontab содержит строку, указывающую время, и команду, которая должна быть выполнена в это время. К примеру, он может выглядеть примерно так, как показано в листинге ниже.
Первая строка указывает команде cron, что программа, запускаемая этой строкой, должна стартовать через 15 минут после наступления каждого часа. Вторая строка сообщает команде cron о том, что запускаемая этой строкой программа должна запускаться ежедневно в 12:30. Третья строка сообщает, что запускаемая программа должна исполняться в 12:35 в первый день каждого месяца, а четвертая — что программа должна запускаться в 12:40 каждый рабочий день. Чтобы завершить работу редактора nano, нажмите клавиатурную комбинацию Ctrl+X и дайте утвердительный ответ на запрос о том, хотите ли вы сохранить внесенные изменения. Каждый раз, когда задание исполняется, в выводной файл будет добавлена одна строка, так что у вас есть возможность наблюдать за процессом.
Чтобы узнать больше о формате файла crontab, из командной строки дайте следующую команду:
Из выведенного руководства вы сможете узнать больше о формате файлов crontab.
Новые методы автоматического запуска сценариев
Основная проблема, связанная с использованием файла crontab, заключается в том, что отнюдь не каждый компьютер постоянно остается включенным. Естественно, программа, запускаемая через команду cron, не сможет начать выполнение, если компьютер выключен в тот момент времени, на который запланирован запуск этой программы.
Как быть, если у вас имеется некоторое задание и вы хотите, чтобы это задание было выполнено в конкретный момент времени (при условии, что компьютер включен). При этом, если компьютер на указанный момент окажется выключенным, вам требуется, чтобы задание было исполнено сразу же после того, как компьютер будет включен (первое, что приходит на ум при упоминании таких заданий — это резервное копирование). Существуют два способа выполнения этой задачи.
Во-первых, вы можете поместить ваш сценарий в один из подкаталогов каталога /etc/periodic. Таких вложенных каталогов всего три — daily, weekly и monthly.
Чтобы выполнить эту задачу, вам необходимо иметь права администратора вашего компьютера, в противном случае вам придется пользоваться одним из старомодных методов.
Сценарии, помещенные в эти каталоги, будут запускаться автоматически через интервалы, о которых несложно догадаться. Говоря точнее, ежедневные задания будут выполняться в 3:15 каждый день, еженедельные — в 3:15 по субботам, а ежемесячные — в 5:30 ежемесячно. Скрипты в каждом каталоге запускаются в алфавитном порядке, поэтому если вы желаете, чтобы один из скриптов всегда выполнялся ранее другого, необходимо позаботиться о соответствующей схеме их именования. Если вы считаете, что такое расписание слишком неудобно и содержит слишком много ограничений, попробуйте пользоваться командой launchd.