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

Running terminal command in swift doesn't work

我正在尝试使用 command -v brew 检查 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

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

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