如何 grep 使用 RunLoop 的 macOS 控制台应用程序的标准输出
How to grep the stdout of a macOS console app that uses RunLoop
这里是 macOS 控制台应用程序的简单 Swift 代码:
import Foundation
print("hello world")
RunLoop.main.run()
在我的真实代码中,我使用 RunLoop
来避免离开控制台应用程序,因为我对一些 CoreBluetooth 事件做出反应并且有一个我想要显示的无限循环。我只想使用 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)就没有输出。管道影响缓冲的默认选择。希望这对您有所帮助!
这里是 macOS 控制台应用程序的简单 Swift 代码:
import Foundation
print("hello world")
RunLoop.main.run()
在我的真实代码中,我使用 RunLoop
来避免离开控制台应用程序,因为我对一些 CoreBluetooth 事件做出反应并且有一个我想要显示的无限循环。我只想使用 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)就没有输出。管道影响缓冲的默认选择。希望这对您有所帮助!