如何在swift脚本中运行终端命令?(例如xcodebuild)

如何在swift脚本中运行终端命令?(例如xcodebuild)

我想用swift替换我的CI bash脚本。我无法弄清楚如何调用普通的终端命令,如lsxcodebuild

#!/usr/bin/env xcrun swiftimport Foundation // Worksprintln("Test") // Worksls // Failsxcodebuild -workspace myApp.xcworkspace // Fails

$ ./script.swift./script.swift:5:1: error: use of unresolved identifier 'ls'ls // Fails^... etc ....


倚天杖
浏览 2263回答 3
3回答

慕工程0101907

如果你不在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

米琪卡哇伊

如果您想在命令行中“完全”使用命令行参数(不分离所有参数),请尝试以下操作。(这个答案改进了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")

长风秋雁

这里的问题是你不能混淆和匹配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"]);至于搜索目录内容(这是lsBash中的内容),我建议NSFileManager直接在Swift中使用和扫描目录,而不是Bash输出,这可能很难解析。
打开App,查看更多内容
随时随地看视频慕课网APP