我已经构建了一个命令行工具,在某些时候,我需要执行一个curl
命令。我正在创建应该执行的脚本,但我不知道如何执行。
我可以创建脚本并将其打印出来,但我无法执行它
它看起来像:curl https://api.github.com/zen
如果不清楚,请问我一些问题。感谢您的帮助。
答案 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) ?? ""
}
在您的情况下,您可能需要查看URLSession
和URLRequest
(取代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")