使用NSTask运行多个终端命令

时间:2016-01-28 09:49:47

标签: swift macos nstask

在swift我的项目中,我计划使用终端命令来获取一些数据。为此,我找到了一些代码并创建了一个函数。如果我一次调用此功能,则没有任何问题。它很棒。但是,如果我连续两次或三次调用这些功能,它有时会很好,有时也不会。

func RunCommand(cmd : String, args : String...) -> (output: [String], error: [String], exitCode: Int32) {

let task  = NSTask()

var output : [String] = []
var error : [String] = []
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")
    }


   let status = task.terminationStatus
task.waitUntilExit()
    return (output, error, status)
}

这是我的功能。例如,如果我使用下面的代码,有时mac和IP地址打印得很好。但有时ip是空的,而且好吧。有时两者都是空的。

let mac = RunCommand("/bin/sh",args:"-c", "ifconfig en1 | grep ether |awk '{print $2}'")

let ip = RunCommand("/bin/sh",args:"-c", "ifconfig | grep 'inet ' | grep -v 127.0.0.1 | cut -d\\  -f2")

print(mac)
print(ip)

你知道我应该如何使用这些代码来获取数据总是没有任何问题吗?

1 个答案:

答案 0 :(得分:0)

我有相同的problem,这很有趣,因为它看起来像我们复制并粘贴了相同的代码示例。我通过简化代码解决了我的问题,最终删除了" if var string ..."语句。