3 回答
TA贡献1887条经验 获得超5个赞
如果你不在Swift代码中使用命令输出,那么下面就足够了:
#!/usr/bin/env swiftimport Foundation@discardableResultfunc shell(_ args: String...) -> Int32 { let task = Process() task.launchPath = "/usr/bin/env" task.arguments = args task.launch() task.waitUntilExit() return task.terminationStatus}shell("ls")shell("xcodebuild", "-workspace", "myApp.xcworkspace")
更新:适用于Swift3 / Xcode8
TA贡献1998条经验 获得超6个赞
如果您想在命令行中“完全”使用命令行参数(不分离所有参数),请尝试以下操作。
(这个答案改进了LegoLess的答案,可以在Swift 4 Xcode 9.3中使用)
func shell(_ command: String) -> String {
let task = Process()
task.launchPath = "/bin/bash"
task.arguments = ["-c", command]
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String
return output
}
// Example usage:
shell("ls -la")
TA贡献1757条经验 获得超7个赞
这里的问题是你不能混淆和匹配Bash和Swift。您已经知道如何从命令行运行Swift脚本,现在需要添加方法以在Swift中执行Shell命令。来自PracticalSwift博客的总结:
func shell(launchPath: String, arguments: [String]) -> String?{ let task = Process() task.launchPath = launchPath task.arguments = arguments let pipe = Pipe() task.standardOutput = pipe task.launch() let data = pipe.fileHandleForReading.readDataToEndOfFile() let output = String(data: data, encoding: String.Encoding.utf8) return output}
以下Swift代码将xcodebuild
使用参数执行,然后输出结果。
shell("xcodebuild", ["-workspace", "myApp.xcworkspace"]);
至于搜索目录内容(这是ls
Bash中的内容),我建议NSFileManager
直接在Swift中使用和扫描目录,而不是Bash输出,这可能很难解析。
- 3 回答
- 0 关注
- 2262 浏览
添加回答
举报