Я использую следующий код, чтобы выполнить команду Баш от Swift:Объединить Баш команды друг с другом
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)
}
Кредит: Get terminal output after a command swift
Когда я запускаю функцию со следующим кодом:
runCommand("/sbin/ifconfig", args: "en1", "|", "grep", "ether")
Для имитации бега следующей команды:
ifconfig en1 | grep ether
Это приведет к некоторому выходу, как это:
ether xx:xx:xx:xx:xx:xx
я получаю следующее сообщение об ошибке:
ifconfig: |: bad value
Я предполагаю, что это потому, что команды не объединены и "|" символ интерпретируется как прямой аргумент ifconfig.
Есть ли способ имитировать поведение такого типа оболочки (использование символа «|» для фильтрации вывода команды) из Swift?
Вам нужно установить выходную трубу первой команды для ввода трубы второго команды. (Вам нужен один объект «NSTask» для команды '/ sbin/ifconfig' и канал, который выводится на вход другого« NSTask' для команды 'grep'.) – nhgrif
Использование оболочки также работает:' runCommand ("/bin/sh ", args:" -c ","/sbin/ifconfig en1 | grep ether ")'. - Btw, код выглядит знакомым http://stackoverflow.com/a/29519615/1187415 :) –
@MartinR Отредактировано оригинальное сообщение, чтобы отдать должное автору кода. Я попробую эти два метода, спасибо! – SamTebbs33