无法保存 unix 可执行文件的输出

无法保存 unix 可执行文件的输出

我正在尝试保存我编写的应用程序的输出。当我尝试通过重定向 stdout 来保存输出时,结果文件为空白。

这是我在 Terminal.app (OS X 10.9.2) 中输入的内容:

./AppName > test.txt

该应用程序通过 NSLog() 输出文本。

我在 Terminal.app 中获得了 NSLog() 输出,但生成的 text.txt 文件为空白。我了解到可能需要通过将 ./ 替换为文件路径来运行该应用程序:

appPath > text.txt

同样的事情也发生了。

有人能向我解释一下这个问题是什么吗?

答案1

您需要合并STDERRSTDOUT。说:

./AppName > test.txt 2>&1

你会看到输出test.txt

答案2

NSLog() 记录到 Apple 系统日志 (ASL) 设备,而不是 stdout 或 stderr。

前往 Console.app 查看“所有消息”日志流或syslog在终端中输入。此外,您可以设置过滤器,让 ASL 将您应用中的所有日志消息发送到特定的文本文件。请参阅 ASL、syslog 等的手册页。

答案3

首先介绍一些背景信息:

默认情况下,普通的 unix 程序以两个文件描述符开始:StdOut 和 StdErr。StdOut
通过文件描述符编号 1 完成。StdErr
通过文件描述符编号 2 完成。

重定向标准输出通过 完成1>。示例./App 1> my_log.txt
重定向标准错误通过 完成2>。示例./App 2> my_errors.txt

>1>是一样的,只不过是缩写形式)

这可以实现一些有用的功能,例如仅记录错误,或将正常输出记录到一个文件,将错误记录到另一个文件。或者非常有用的情况是将正常输出记录到一个文件,同时仍让任何错误显示在屏幕上。


将 ./Appname 替换为完整文件路径不会产生任何影响。一个从当前目录启动应用程序,一个指定应用程序的完整路径。两者都不会影响文件描述符。


现在我们终于可以回答你的问题了:

您想要做的是记录 NSlog() 的输出。为此,您首先要找出 nslog 正在写入的位置。

根据这是我们的姊妹网站 StackOverflow 上的一个问题NSLog 输出到 ASL(Apple 版本的 syslog)和控制台。

因此,您要么想要读取系统日志的输出,要么将日志的输出更改为可以轻松拦截它的位置。例如freopen([path cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);

我链接的 [so] 帖子回答了几种如何做到这一点的方法。如果你在帖子中添加更多详细信息(例如,是否允许修改应用程序?),那么我可以更详细地回答。

相关内容