在swift中运行终端命令不起作用

时间:2016-02-06 17:16:20

标签: swift macos bash command nstask

我尝试使用brew检查command -v brew命令是否可用。终端输出示例:

MacBook-Air-USER:~ USER$ command -v brew 
/usr/local/bin/brew

我正在使用此代码:

func runCommand(command cmd : String) -> Array<String> {
    var result : Array<String> = []

    let task = NSTask()
    task.launchPath = "/bin/bash"
    task.arguments = (["-c", cmd])

    let pipe = NSPipe()
    task.standardOutput = pipe
    let handle = pipe.fileHandleForReading
    handle.waitForDataInBackgroundAndNotify()

    let errPipe = NSPipe()
    task.standardError = errPipe
    let errHandle = errPipe.fileHandleForReading
    errHandle.waitForDataInBackgroundAndNotify()

    var startObserver : NSObjectProtocol!
    startObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSFileHandleDataAvailableNotification, object: nil, queue: nil) { notification -> Void in
        let data = handle.availableData
        if data.length > 0 {
            if let output = String(data: data, encoding: NSUTF8StringEncoding) {
                print("Output : \(output)")
                result.append(output)
            }
        }
        else {
            print("EOF on stdout")
            NSNotificationCenter.defaultCenter().removeObserver(startObserver)
        }
    }

    var endObserver : NSObjectProtocol!
    endObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSTaskDidTerminateNotification, object: nil, queue: nil) {
    notification -> Void in
        print("Task terminated with code \(task.terminationStatus)")
        NSNotificationCenter.defaultCenter().removeObserver(endObserver)
    }

    var errObserver : NSObjectProtocol!
    errObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSTaskDidTerminateNotification, object: nil, queue: nil) {
    notification -> Void in
        let data = errHandle.availableData
        if (data.length > 0) {
            if let output = String(data: data, encoding: NSUTF8StringEncoding) {
                print("Error : \(output)")
                result.append(output)

                NSNotificationCenter.defaultCenter().removeObserver(errObserver)
            }
        }
    }

    task.launch()
    task.waitUntilExit()
    return result
}

并按照以下方式运行:

let arr = runCommand(command: "command -v brew")

阵列总是空的 - 我无法获得任何输出。如何解决这个问题?

UPD:如果我尝试which brew命令

,也会发生同样的情况

UPD2:它仅适用于内置命令,例如ls,但不适用于brewtor

等命令

1 个答案:

答案 0 :(得分:1)

可能未设置为运行命令而创建的$PATH实例的bash。一种方法是为命令指定显式路径:

runCommand(command: "command -v /usr/local/bin/brew")