![](/img/trans.png)
[英]Running terminal commands from Cocoa App in Swift failing: “command not found” but works using Command Line Tool in swift
[英]swift command line tool for git commands, but its no
我想使用 swift 为 git 命令创建一个工具。
我收到 git 错误用法: git [--version] [--help] [-C ] [-c =] 。
有没有办法将它作为命令行 package 分发并在swift文件中使用?
import Foundation
struct Task {
static let shared = Task()
func run(with args: String...){
let task = Process()
task.launchPath = "/usr/bin/git"
task.arguments = ["-c", args.joined(separator: " ")]
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data: data, encoding: .utf8)!
print(output)
task.waitUntilExit()
}
}
let task = Task.shared
task.run(with: "status")
task.run(with: "fetch --all")
task.run(with: "add --all")
您在代码中使用了不推荐使用的方法,并且缺少其他一些东西。
首先我们应该设置 shell 使用
func run(with args: String...){
let task = Process()
task.executableURL = URL(fileURLWithPath: "/bin/zsh")
然后,我们不使用已弃用的启动路径,而是使用完整命令构建一个字符串,并将其设置为任务的launchPath
let arguments = "/usr/bin/git \(args.joined(separator: " "))"
task.arguments = ["-c", arguments]
我也认为通过检查标准错误来处理任何错误是个好主意
let pipe = Pipe()
let errorPipe = Pipe()
task.standardOutput = pipe
task.standardError = errorPipe
不要使用已弃用的launch
方法,而是使用run
并读取标准输出和标准错误
do {
try task.run()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
if !data.isEmpty {
if let output = String(data: data, encoding: .utf8) {
print(output)
}
}
let error = errorPipe.fileHandleForReading.readDataToEndOfFile()
if !error.isEmpty {
if let errorMessage = String(data: error, encoding: .utf8) {
print(errorMessage)
}
}
} catch {
print(error)
}
对于一个简单的命令,可能值得在if/else
中处理标准 output 和标准错误,因此请随意更改,但对于更复杂的命令,例如处理多个文件,它可能会同时产生 output 和错误
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.