我正在尝试从用 Swift 编写的 Mac 应用程序执行“历史记录”命令。
@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 应用程序使用用户命令行历史记录吗?
使用某些内置GNU
命令与NSTask
(这被认为是“交互式”的,比如history
)通常需要设置环境变量,以便 shell 知道要返回什么,例如:
private let env = NSProcessInfo.processInfo().environment
这可能很困难,因为显然并非所有用户都使用相同的环境变量或 shell。另一种方法是使用 bash 命令NSTask
不需要获取/设置环境:
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 历史记录的编号格式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)