2015-04-09 2 views
2

Я использую следующий код, чтобы выполнить команду Баш от 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?

+1

Вам нужно установить выходную трубу первой команды для ввода трубы второго команды. (Вам нужен один объект «NSTask» для команды '/ sbin/ifconfig' и канал, который выводится на вход другого« NSTask' для команды 'grep'.) – nhgrif

+3

Использование оболочки также работает:' runCommand ("/bin/sh ", args:" -c ","/sbin/ifconfig en1 | grep ether ")'. - Btw, код выглядит знакомым http://stackoverflow.com/a/29519615/1187415 :) –

+0

@MartinR Отредактировано оригинальное сообщение, чтобы отдать должное автору кода. Я попробую эти два метода, спасибо! – SamTebbs33

ответ

0

решаемый с комментарием nhgrif по: Combine bash commands with each other

+0

3 вещи, 1. Ссылка на комментарий в ответе. 2. Ping пользователь, заявив, что вы перевели свой комментарий в ответ 3. (необязательно) Создайте wiki сообщества ans, поскольку это не ваши усилия. –

+0

@BhargavRao. Вы не можете пометить (что я предполагаю, что вы имеете в виду под «ping») пользователей в ответе. Как связать комментарий и как я могу ответить от имени сообщества? – SamTebbs33

+1

Вы можете запросить пользователя в комментариях выше. Временная метка комментария дает ссылку на комментарий. –

Смежные вопросы