为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2019-08-26 19:23:38
如何在swift脚本中运行终端命令?(例如xcodebuild)我想用swift替换我的CI bash脚本。我无法弄清楚如何调用普通的终端命令,如ls或xcodebuild#!/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 ....
查看完整描述

3 回答

?
慕工程0101907

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


查看完整回答
反对 回复 2019-08-26
?
米琪卡哇伊

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")


查看完整回答
反对 回复 2019-08-26
?
长风秋雁

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"]);

至于搜索目录内容(这是lsBash中的内容),我建议NSFileManager直接在Swift中使用和扫描目录,而不是Bash输出,这可能很难解析。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 2180 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信