【发布时间】:2023-03-03 19:17:01
【问题描述】:
我正在尝试使用 NSTask 运行 UNIX 'apropos' 命令。这是我的代码:
NSTask *apropos = [[NSTask alloc] init];
NSPipe *pipe = [[NSPipe alloc] init];
[apropos setLaunchPath:@"/usr/bin/apropos"];
[apropos setArguments:[NSArray arrayWithObjects:@"filename", @"match", nil]];
[apropos setStandardOutput:pipe];
[apropos launch];
[apropos waitUntilExit];
问题是这永远不会返回。我还尝试使用 Apple 的示例代码 (TaskWrapper),它返回输出(分三段),但它从不调用 processFinished 处理程序。
此外,appendOutput: 处理程序接收重复项。因此,例如,如果 apropos 返回:
1 2 3 4 5
我可能会收到这样的东西:
1 2 3
1 2 3 4
5
(分为 3 条附加消息)。
我注意到 Apropos 以一种可以在命令行中上下滚动的格式显示输出,而不是直接将数据直接输出到标准输出;如何通过 NSTask 和 NSPipe 可靠地读取此内容?
【问题讨论】:
-
关于滚动输出,我假设 apropos 正在通过 less 管道输出其输出;有没有办法强迫它不这样做?这可能是解决方案。
-
apropos 使用默认为 less 的 PAGER 环境变量,因此将 PAGER 设置为更贴切的东西,比如 cat 会起作用:)
-
嗯,这个应用不能修改环境变量(它是给用户安装的应用)。