В процессе написания утилит на Swift бывает необходимо запустить другую консольную утилиту с параметрами. Поскольку в Swift доступны для использования все стандартные библиотеки macOS и iOS мы можем с легкостью это сделать, используя API фреймворка Foundation.
Предположим на нужно запустить утилиту plutil, которая работает с файлами plist на проверку определенного файла на валидность. Это можно сделать при помощи следующего кода:
//создадим экземпляр класса NSTask
let task = NSTask()
//в поле launchPath зададим путь к утилите, которую хотим запустить
task.launchPath = "/usr/bin/plutil"
//в arguments поместим массив с аргументами для plutil
task.arguments = ["-lint", path]
//создадим экземпляр NSPipe, чтобы получить результат работы plutil и позже обработать его
let pipe = NSPipe()
//наш pipe присвоим переменной standardOutput таска, чтобы он знал с каким потоком ввода/вывода работать
task.standardOutput = pipe
//синхронно стартуем таск на выполнение
task.launch()
//чтобы получить результат работы plutil достанем хэндлер файла для чтения результата и прочтем его в константу data
let data = pipe.fileHandleForReading.readDataToEndOfFile()
//последнее, что остается сделать - создать строку из данных
//используем конструкцию с проверкой на nil, чтобы не нарваться на пустое значение и не уронить наш скрипт
if let plutilResult = NSString(data: data, encoding: NSUTF8StringEncoding)
{
print(plutilResult)
}
Для автоматизации рутинных задач очень удобно писать маленькие скрипты, которые выполняют ту или иную функцию. Для этих целей я в основном использую Python и Swift. Если с запуском Python-скриптов все просто, то со Swift есть некоторые нюансы. О них вы узнаете из этой статьи.
Из консоли можно запустить как бинарник программы, написанной на Swift, так и сам скрипт. Обычно я выбираю второй вариант, потому что с ним проще, его можно в любой момент отредактировать или доработать.
Для того, чтобы запустить на исполнение *.swift файл первым делом необходимо первой строкой в файле написать следующий код
#!/usr/bin/env xcrun swift
Этот код даст указание башу на то, чем необходимо исполнять код в файле, в нашем случае это будет xcrun. Далее следует код нашего скрипта.
После того, как программа закончена, необходимо сделать файл скрипта исполняемым, для этого в консоли необходимо написать следующее:
chmod +x имя_нашего_скрипта.swift
Тут мы делаем скрипт исполняемым.
Далее чтобы запустить скрипт в консоли нужно перейти в директорию, где он находится и написать следующее:
./имя_нашего_скрипта.swift
Вот и все, теперь можно писать различную автоматизацию на этом замечательном языке от компании Apple :)
При запуске программ на Swift из командной строки бывает необходимо передать параметры скрипту. Это удобно, когда нужно специфицировать поведение программы. Например заставить ее просканировать все дерево каталогов на наличие файлов, либо указать на конкретный файл для обработки.
Для этих целей в стандартной библиотеке Swift существует класс Process, который содержит массив строк, под названием arguments. Следующий код выведет все аргументы, переданные скрипту:
for argument in Process.arguments
{
print(argument);
}
При этом первым аргументом будет передан путь к файлу скрипта и его имя.
Посмотрим, что будет содержаться в массиве arguments если вызвать скрипт следующим способом: