命令swift后获取终端输出

pom*_*nto 8 terminal console-output swift

我使用以下代码在终端中运行一些命令:

system("the command here")
Run Code Online (Sandbox Code Playgroud)

在我想知道运行此命令的结果后,例如,如果我运行

system("git status")
Run Code Online (Sandbox Code Playgroud)

我想阅读有关我的回购变更的实际信息.有没有办法在swift中做到这一点?

Mar*_*n R 26

NSTask是作为子进程运行另一个程序的类.您可以捕获程序的输出,错误输出,退出状态等等.

扩展我对xcode 6 swift system()命令的回答,这是一个简单的实用程序函数,用于同步运行命令,并返回输出,错误输出和退出代码(现在更新为Swift 2):

func runCommand(cmd : String, args : String...) -> (output: [String], error: [String], exitCode: Int32) {

    var output : [String] = []
    var error : [String] = []

    let task = NSTask()
    task.launchPath = cmd
    task.arguments = args

    let outpipe = NSPipe()
    task.standardOutput = outpipe
    let errpipe = NSPipe()
    task.standardError = errpipe

    task.launch()

    let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()
    if var string = String.fromCString(UnsafePointer(outdata.bytes)) {
        string = string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
        output = string.componentsSeparatedByString("\n")
    }

    let errdata = errpipe.fileHandleForReading.readDataToEndOfFile()
    if var string = String.fromCString(UnsafePointer(errdata.bytes)) {
        string = string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
        error = string.componentsSeparatedByString("\n")
    }

    task.waitUntilExit()
    let status = task.terminationStatus

    return (output, error, status)
}
Run Code Online (Sandbox Code Playgroud)

样品用法:

let (output, error, status) = runCommand("/usr/bin/git", args: "status")
print("program exited with status \(status)")
if output.count > 0 {
    print("program output:")
    print(output)
}
if error.count > 0 {
    print("error output:")
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只对输出感兴趣,而不是错误消息或退出代码:

let output = runCommand("/usr/bin/git", args: "status").output
Run Code Online (Sandbox Code Playgroud)

输出和错误输出作为字符串数组返回,每行一个字符串.

第一个参数runCommand()必须是可执行文件的完整路径,例如"/usr/bin/git".你可以使用shell启动程序(这system()也是):

let (output, error, status) = runCommand("/bin/sh", args: "-c", "git status")
Run Code Online (Sandbox Code Playgroud)

优点是可以通过默认搜索路径自动找到"git"可执行文件.缺点是如果它们包含空格或其他在shell中具有特殊含义的字符,则必须正确引用/转义参数.


Swift 3更新:

func runCommand(cmd : String, args : String...) -> (output: [String], error: [String], exitCode: Int32) {

    var output : [String] = []
    var error : [String] = []

    let task = Process()
    task.launchPath = cmd
    task.arguments = args

    let outpipe = Pipe()
    task.standardOutput = outpipe
    let errpipe = Pipe()
    task.standardError = errpipe

    task.launch()

    let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()
    if var string = String(data: outdata, encoding: .utf8) {
        string = string.trimmingCharacters(in: .newlines)
        output = string.components(separatedBy: "\n")
    }

    let errdata = errpipe.fileHandleForReading.readDataToEndOfFile()
    if var string = String(data: errdata, encoding: .utf8) {
        string = string.trimmingCharacters(in: .newlines)
        error = string.components(separatedBy: "\n")
    }

    task.waitUntilExit()
    let status = task.terminationStatus

    return (output, error, status)
}
Run Code Online (Sandbox Code Playgroud)

  • @NikitinRoman:现在我明白了你的意思.NSTask有一个currentDirectoryPath属性,可以设置为应该执行命令的目录.我会更新代码...... (2认同)