运行 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
,但不适用于 brew
或 tor
为运行命令创建的bash
实例的$PATH
可能未设置。解决这个问题的一种方法是为命令指定一个显式路径:
runCommand(command: "command -v /usr/local/bin/brew")
我正在尝试使用 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
为运行命令创建的bash
实例的$PATH
可能未设置。解决这个问题的一种方法是为命令指定一个显式路径:
runCommand(command: "command -v /usr/local/bin/brew")