【问题标题】:Running terminal command in swift doesn't work在 swift 中运行终端命令不起作用
【发布时间】:2016-05-16 14:21:32
【问题描述】:

我正在尝试使用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 等命令

【问题讨论】:

  • 我的电脑上没有 Brew,但是当我尝试 let arr = runCommand(command: "which ls") 时运行正常
  • @CodeDifferent,实际上,它只能使用内置命令运行,但不能使用 tor 或 brew 之类的命令

标签: swift macos bash command nstask


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2015-03-14
    • 2018-09-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多