Swift进程 - 执行命令错误

时间:2017-04-06 22:29:31

标签: swift bash macos terminal

我正在尝试使用Swift编写的Mac App执行“history”命令。

@discardableResult
func shell(_ args: String...) -> Int32 {
    let task = Process()
    task.launchPath = "/bin/bash"
    task.arguments = args
    task.launch()
    task.waitUntilExit()
    return task.terminationStatus
}

shell("history")

总是给我这个错误:

env: history: No such file or directory

有什么问题?是否可以使用Mac App中的用户命令行历史记录?

2 个答案:

答案 0 :(得分:2)

将某些内置GNU命令与NSTask(被视为“交互式”,如history)通常需要设置环境变量,以便shell知道要返回的内容,例如:

private let env = NSProcessInfo.processInfo().environment

这可能很困难,因为并非所有用户显然都使用相同的环境变量或shell。另一种方法是在NSTask中使用不需要获取/设置环境的bash命令:

let task = Process()
task.launchPath = "/bin/bash"
task.arguments = ["-c", "cat -n ${HOME}/.bash_history"]

let pipe = Pipe()
task.standardOutput = pipe
task.launch()

let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)

print(output!)

结果输出应类似于实际shell历史记录的编号格式。

答案 1 :(得分:1)

history命令是内部bash命令。因此,正确的语法是:

$ bash -C history

shell函数中:

task.arguments = ["-C"] + args