在终端中执行Swift脚本

时间:2017-04-18 01:05:34

标签: swift bash shell command-line terminal

我已经构建了一个命令行工具,在某些时候,我需要执行一个curl命令。我正在创建应该执行的脚本,但我不知道如何执行。

我可以创建脚本并将其打印出来,但我无法执行它 它看起来像:curl https://api.github.com/zen

如果不清楚,请问我一些问题。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用NSTask(现在在Swift 3中称为Process)从Swift运行终端命令:如果需要输出,请在末尾添加let output = handle.readDataToEndOfFile()。这是包含在函数中的整个事物(launchPath将是/usr/bin/curl):

func runTask(launchPath: String, flags: [String]) -> String {
    let task = Process()
    let pipe = Pipe()
    task.launchPath = launchPath
    task.arguments = flags
    task.standardOutput = pipe
    let handle = pipe.fileHandleForReading
    task.launch()
    return String(data: handle.readDataToEndOfFile(), encoding: .utf8) ?? ""
}

在您的情况下,您可能需要查看URLSessionURLRequest(取代NSURLRequest)。要创建对您的URL和凭据的请求,您只需执行以下操作:

    var request = URLRequest(url:URL(string: "https://api.github.com/zen")!)
    request.setValue("application/vnd.github.v3.raw", forHTTPHeaderField: "Accept")
    request.setValue("token USERTOKEN", forHTTPHeaderField: "Authorization")
    let session = URLSession(configuration: .default)
    session.dataTask(with: request, completionHandler: {(data, response, error) in
        guard let data = data, error == nil else {
            print("Error: \(error.debugDescription)")
            return
        }
        guard let output = String(data: data, encoding: .utf8) as String? else {
            print("Unable to format output data")
            return
        }
        print(output)
    }).resume()

答案 1 :(得分:1)

#!/usr/bin/env swift

import Foundation

func run(_ args: String...) -> Int32 {
    let task = Process()
    task.launchPath = "/usr/bin/env"
    task.arguments = args
    task.launch()
    task.waitUntilExit()
    return task.terminationStatus
}

run("curl", "https://api.github.com/zen")