快速执行命令后获取终端输出

apple_world标尺

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

system("the command here")

然后,我想知道运行此命令的结果是什么,例如,如果运行

system("git status")

我想阅读有关回购中更改的实际信息。有什么办法可以迅速做到这一点?

马丁·R

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

用法示例:

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

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

let output = runCommand("/usr/bin/git", args: "status").output

输出和错误输出以字符串数组形式返回,每行一个字符串。

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

let (output, error, status) = runCommand("/bin/sh", args: "-c", "git status")

优点是可以通过默认搜索路径自动找到“ 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)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正常执行命令后,如何在终端中保存上次执行命令的输出?

来自分类Dev

没有终端输出的执行命令

来自分类Dev

执行命令后如何控制输出?

来自分类Dev

python-执行命令并获取输出

来自分类Dev

执行命令时如何隐藏终端输出?

来自分类Dev

执行命令时如何隐藏终端输出?

来自分类Dev

通过shell执行命令后不返回输出

来自分类Dev

通过android应用获取已执行命令的输出

来自分类Dev

在终端中执行命令后,有时我无法执行其他命令

来自分类Dev

在终端中执行命令后,有时我无法执行其他命令

来自分类Dev

获取所有文件后才执行命令

来自分类Dev

打开终端时自动执行命令

来自分类Dev

在终端启动(macOS)时执行命令

来自分类Dev

从Netlogo在终端中执行命令

来自分类Dev

为命令的特定输出执行命令

来自分类Dev

在shell命令输出上执行命令

来自分类Dev

如何快速执行终端命令?

来自分类Dev

快速执行命令而不会耗尽内存

来自分类Dev

是否可以将Python脚本中的文本作为可执行命令输出到终端?

来自分类Dev

如何在cronjob中执行命令以在终端中显示输出

来自分类Dev

打开外壳后,如何打开终端窗口并执行命令?

来自分类Dev

grep匹配第一个命令的输出后如何执行命令

来自分类常见问题

如何使用POSIX在C ++中执行命令并获取命令的输出?

来自分类Dev

执行命令不反馈输出

来自分类Dev

在zmap中执行命令后的猫

来自分类Dev

inotifywait建立监视后执行命令

来自分类Dev

inotifywait建立监视后执行命令

来自分类Dev

执行命令后如何应用-v?

来自分类Dev

我执行命令后出现黑屏