我正在尝试使用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中的用户命令行历史记录?
答案 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