【发布时间】: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,但不适用于 brew 或 tor 等命令
【问题讨论】:
-
我的电脑上没有 Brew,但是当我尝试
let arr = runCommand(command: "which ls")时运行正常 -
@CodeDifferent,实际上,它只能使用内置命令运行,但不能使用 tor 或 brew 之类的命令
标签: swift macos bash command nstask