swift - 如何 grep 使用 RunLoop 的 macOS 控制台应用程序的标准输出

标签 swift macos grep console-application nsrunloop

这里是 macOS 控制台应用程序的简单 Swift 代码:

import Foundation

print("hello world")
RunLoop.main.run()

在我的真实代码中,我使用 RunLoop 来避免离开控制台应用程序,因为我对一些 CoreBluetooth 事件使用react并且有一个我想要显示的无限循环。我只想使用 Ctrl+C 退出应用程序。

但是,当使用 RunLoop.main.run() 时,我无法再在终端中对输出进行 grep:

$ ./app
hello world
^C
$ ./app | grep hello
^C

关于如何 grep 输出的一些想法? 我猜 RunLoop 的使用是个坏主意,但是如果没有一种主动等待或手动管理一些执行线程,还有什么替代方案呢?

最佳答案

您可以尝试刷新标准输出:

fflush(__stdoutp)

或将 stdout 上的缓冲区大小设置为零(使其速度更快,但使用更多资源):

setbuf(__stdoutp, nil)

参见 Swift: how to flush stdout after println?

这通常是解决方案,当您看到终端的输出,但一旦将进程通过管道传输到另一个进程(如 grep)就没有输出。管道影响缓冲的默认选择。希望这对您有所帮助!

关于swift - 如何 grep 使用 RunLoop 的 macOS 控制台应用程序的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52233061/

相关文章:

ios - 您的凭据不允许访问此资源 Twitter API 错误

ios - 支持 iOS6 到 9 的后台位置更新

java - 如何在终端中运行 Java 类

linux - 使用 Readline 在 bash 中注释掉命令行

linux - 提取节点 IP 而不解析 ifconfig 的输出

ios - 将更多数据附加到公共(public)类中定义的 api

ios - 检查 JSON 对象是否为 null swift 3

Java 1.6.x ant 在 OSX 上构建速度较慢?

Linux grep命令

linux - 在 linux 中是否有显示特定命令选项的详细描述的技巧