<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Just Developer Blog, заметки с тегом: запуск утилиты из swift скрипта</title>
<link>http://bibobo.ru/tags/zapusk-utility-iz-swift-skripta/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Запуск консольных утилит из скрипта на Swift</title>
<guid isPermaLink="false">34</guid>
<link>http://bibobo.ru/all/zapusk-konsolnyh-utilit-iz-skripta-na-swift/</link>
<comments>http://bibobo.ru/all/zapusk-konsolnyh-utilit-iz-skripta-na-swift/</comments>
<description>&lt;p&gt;В процессе написания утилит на &lt;i&gt;Swift&lt;/i&gt; бывает необходимо запустить другую консольную утилиту с параметрами. Поскольку в &lt;i&gt;Swift&lt;/i&gt; доступны для использования все стандартные библиотеки &lt;i&gt;macOS&lt;/i&gt; и &lt;i&gt;iOS&lt;/i&gt; мы можем с легкостью это сделать, используя &lt;i&gt;API&lt;/i&gt; фреймворка &lt;i&gt;Foundation&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;input id="button_swift_from_terminal_run" type="button" onclick="toggle(cut_swift_from_terminal_run, button_swift_from_terminal_run)" value="Читать дальше" hiddenText="Свернуть" visibleText="Читать дальше"&gt;&lt;/p&gt;
&lt;div id="cut_swift_from_terminal_run" style="display: none;" displayOld=""&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Предположим на нужно запустить утилиту &lt;i&gt;plutil&lt;/i&gt;, которая работает с файлами &lt;i&gt;plist&lt;/i&gt; на проверку определенного файла на валидность. Это можно сделать при помощи следующего кода:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;//создадим экземпляр класса NSTask
let task = NSTask()

//в поле launchPath зададим путь к утилите, которую хотим запустить
task.launchPath = &amp;quot;/usr/bin/plutil&amp;quot;

//в arguments поместим массив с аргументами для plutil
task.arguments = [&amp;quot;-lint&amp;quot;, 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)
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
<pubDate>Tue, 19 Feb 2019 19:34:22 +0300</pubDate>
</item>


</channel>
</rss>