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

2023-12-01

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

system("the command here")

在我想知道运行这个命令的结果是什么之后,例如如果我跑

system("git status")

我想阅读有关我的存储库中更改的实际信息。有什么办法可以快速做到这一点吗?


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"。您可以使用 shell 启动该程序(这就是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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速执行命令后获取终端输出 的相关文章

随机推荐

  • 在 postgres 中,使用表达式 array[] 与使用带有 {} 的数组的字符串表示形式有什么区别吗?

    使用两种不同的语法引用或创建数组有什么区别 array 1 2 3 vs 1 2 3 使用两者有什么好处吗 The ARRAY is the 表达与值构造函数 这 是字符串文字 constant 处理过程略有不同 但对于几乎用例来说 没有任
  • Launch4j / Windres:如何正确设置路径?

    我为我的项目配置了 launch4j 当我在 windowsXP 上开发时 我又使用了它 它在那里工作 现在我也需要它在 mac 上构建 我的build xml
  • 在 Mootools 中解析 XML

    似乎没有任何关于在 Mootools 中解析 XML 的有用文档 要么它太简单了 没有人愿意提及它 要么它太难了 每个人都放弃了尝试 有没有人有任何简单的跨浏览器方法来使用 Mootools 解析 XML 这是我的小 XML 文件 data
  • 将一个数据帧拆分为多个数据帧

    我有一个数据框 需要根据正则表达式搜索将其拆分为多个数据框 搜索没有固定的模式 即有时只有一个正则表达式 有时是多个正则表达式的组合 这是一个仅提取一组行的最小示例 Name lt c John Jane Arthur Maggie Age
  • 使用 Azure Active Directory 对用户进行身份验证后执行代码

    我使用 VS2015 创建了一个 ASP NET MVC Core 1 1 0 应用程序 在对话框中 我选择了连接到 Azure AD 的选项 因此 VS 生成了样板代码 并且正如预期的那样 应用程序将我重定向到 Microsoft 的登录
  • 插入一个元素

    Javascript中是否有一种方法可以在当前节点之后插入一个元素 我知道有一种方法可以在XML的当前节点之前插入一个元素 但是有没有一种方法可以在当前节点之后插入一个元素 在当前节点之后 只需获取当前节点的下一个兄弟节点并在该节点之前插入
  • 对单表使用 Merge 语句

    是否可以对单表使用merge语句 我想在插入之前检查是否已存在相同的值集 则应更新该记录 如果不存在 则应插入该记录 我在互联网上搜索过 但我得到了带有 2 个表的合并语句的示例 我在一张桌子上尝试过 但无法获得积极的结果 我试图检查的值将
  • Realm 数据库中的搜索操作速度

    这是我的模型RealmObject class public class ARDatabase extends RealmObject PrimaryKey private String uid private String namex p
  • 未捕获的类型错误:无法调用未定义的方法“hasChildNodes”

    我正在尝试使用 jquery 中的 ajax 请求读取 XML 下面是代码 它在 IE 中工作正常 但是当我在 Chrome 上运行它时 我遇到了这个错误 未捕获的类型错误 无法调用未定义的方法 hasChildNodes ajax typ
  • 如何从 querySelectorAll 获取所有元素并与 addEventListener 一起使用

    我有一个块 当我单击加号时 会创建 4 个子块 当我单击任何子块加号按钮时 我必须添加 rooms guests plus类 它们增加自0 to 5当单击减号按钮时 rooms guests minus类 以同样的方式减少 const ro
  • 在 Android 上运行模拟器时出错

    我正在尝试在 Android 上运行 PhoneGap 应用程序 当我运行命令时 phonegap run android emulator verbose 我收到这个错误 Running command getprop emu uuid
  • 具有连续分隔符的 strtok_s 行为

    我正在并行解析 3 个值 这些值用特定的分隔符分隔 token1 strtok s str1 separator nextToken1 token2 strtok s str2 separator nextToken2 token3 str
  • Python“使用错误的参数类型调用”错误

    我明白为什么我会收到此错误 它正在寻找我的对象作为参数 并接收字符串值 但我很困惑 不知道解决方案是什么 以下代码片段只是尝试运行此命令 self buttonGroup addButton self ui m001 x 次数 num 0
  • 如何在 Struts 2 中使用 DispatcherListener

    有一个界面DispatcherListener在Struts2中 文档说 一个接口来标记那些想要在init and destroy of a Dispatcher 但是这个接口怎么用呢 如果我创建一个实现这个接口的类 我应该如何将它配置到S
  • 我如何使用空手道测试以 AVRO 格式给出响应的其余端点?

    Karate 对于验证我们提供 json 响应的其余 api 非常有帮助 现在我们有了 api 它可以为我们提供 avro 格式的响应 可能还需要以 avro 格式发送有效负载 我如何使用空手道测试以 AVRO 格式给出响应的其余端点 有什
  • Python/Pandas:如果列有多个值,则转换为列表中具有多个值的单行

    在我的数据框中 我有很多相同的实例AutoNumber有不同的KeyValue String 我想将这些实例转换为单行 其中KeyValue String是由多个唯一值组成的列表 AutoNumber KeyValue String Ref
  • 如何连续向下滚动页面直到找到某个元素? Python 硒

    我对 Linkedin 技能部分的加载更多按钮感到困惑 我在查找按钮的 xpath 时收到此错误 selenium common exceptions NoSuchElementException Message no such eleme
  • xmlHttpRequest abort() 方法不会关闭 Internet Explorer 中的连接

    我有多个xmlHttpRequest在我的页面上 我正在尝试调用abort 对他们所有人的方法 在 FF 中效果很好 另一方面 IE 却没有做任何该死的事情 连接不会关闭 并且在请求完成之前我无法导航到另一个页面 这是什么 为什么 IE 不
  • 从 Angular 5 Universal 获取域名始终返回 127.0.0.1

    我在 Angular 5 应用程序的服务器端渲染方面遇到问题 我需要域来创建正确的链接 应用程序在不同的环境中使用 并且为每个端点创建几个包是个坏主意 所以我尝试使用堆栈中的选项 但我总是得到 127 0 0 1 4000 作为域 主机 我
  • 快速执行命令后获取终端输出

    我使用以下代码在终端中运行一些命令 system the command here 在我想知道运行这个命令的结果是什么之后 例如如果我跑 system git status 我想阅读有关我的存储库中更改的实际信息 有什么办法可以快速做到这一