NSTask
классно запустить другую программу в качестве подпроцесс. Вы можете записать выход программы, выход ошибки, статус выхода и многое другое.
Расширение на мой ответ на xcode 6 swift system() command, здесь простая функция полезности для запуска команды синхронно, и возвращает выходной, выходной ошибка и код выхода (в настоящее время обновляется для Swift 2):
func runCommand(cmd : String, args : String...) -> (output: [String], error: [String], exitCode: Int32) {
var output : [String] = []
var error : [String] = []
let task = NSTask()
task.launchPath = cmd
task.arguments = args
let outpipe = NSPipe()
task.standardOutput = outpipe
let errpipe = NSPipe()
task.standardError = errpipe
task.launch()
let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()
if var string = String.fromCString(UnsafePointer(outdata.bytes)) {
string = string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
output = string.componentsSeparatedByString("\n")
}
let errdata = errpipe.fileHandleForReading.readDataToEndOfFile()
if var string = String.fromCString(UnsafePointer(errdata.bytes)) {
string = string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
error = string.componentsSeparatedByString("\n")
}
task.waitUntilExit()
let status = task.terminationStatus
return (output, error, status)
}
Пример использования:
let (output, error, status) = runCommand("/usr/bin/git", args: "status")
print("program exited with status \(status)")
if output.count > 0 {
print("program output:")
print(output)
}
if error.count > 0 {
print("error output:")
print(error)
}
или, если вы заинтересованы только в выходные, но не в сообщения об ошибках или код выхода:
let output = runCommand("/usr/bin/git", args: "status").output
Выходные данные и вывод ошибок возвращаются в виде массива строк, одна строка для каждой строки.
Первый аргумент runCommand()
должен быть полным путем к исполняемому файлу , например "/usr/bin/git"
. Вы можете запустить программу, используя оболочку (которая является то, что system()
также делает):
let (output, error, status) = runCommand("/bin/sh", args: "-c", "git status")
Преимущество заключается в том, что «мерзавец» исполняемый файл автоматически найден по пути поиска по умолчанию. Недостатком является то, что вы должны правильно указывать/исключать аргументы , если они содержат пробелы или другие символы , которые имеют особое значение в оболочке.
Обновление для Swift 3:
func runCommand(cmd : String, args : String...) -> (output: [String], error: [String], exitCode: Int32) {
var output : [String] = []
var error : [String] = []
let task = Process()
task.launchPath = cmd
task.arguments = args
let outpipe = Pipe()
task.standardOutput = outpipe
let errpipe = Pipe()
task.standardError = errpipe
task.launch()
let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()
if var string = String(data: outdata, encoding: .utf8) {
string = string.trimmingCharacters(in: .newlines)
output = string.components(separatedBy: "\n")
}
let errdata = errpipe.fileHandleForReading.readDataToEndOfFile()
if var string = String(data: errdata, encoding: .utf8) {
string = string.trimmingCharacters(in: .newlines)
error = string.components(separatedBy: "\n")
}
task.waitUntilExit()
let status = task.terminationStatus
return (output, error, status)
}
Возможный дубликат [команда Xcode 6 скор система()] (HTTP: // StackOverflow.ком/вопросы/26399301/Xcode-6-скор-системы команд). –
@MartinR, нет информации о том, как запускать сразу несколько команд или запускать команды за один сеанс. –
Для выполнения команды и ее вывода вы должны использовать NSTask. Для нескольких команд создайте и выполните несколько NSTasks. –