0

我已经阅读了使用 NSTask 执行此操作的解决方案:它们看起来都非常长......所以我设法使用这段代码(它同时获得标准输出和标准错误)做了完全相同的事情:

NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[ @"-c", @"aCommand"]];
NSString *stringToRemove = [task description];
[task launch];
NSString *output = [[task description] stringByReplacingOccurrencesOfString:stringToRemove withString:@""];

使用此解决方案有什么缺点吗?有没有更短的方法来过滤输出?

4

1 回答 1

3

使用此解决方案有什么缺点吗?有没有更短的方法来过滤输出?

是的,很多缺点。您依赖的实现细节description会神奇地返回任务的命令行和输出。文档没有声明,description除了调试/日志记录之外也没有真正可以接受的使用。

即该代码仅在方便时起作用。

但是该代码并没有真正起作用。如果您要运行的命令永远不会退出或需要一段时间才能运行或产生大量输出,那么该代码可能实际上根本没有获取任何输出或产生截断的输出。

NSTask使用的示例往往有点冗长,这是有原因的。管理进程之间的 I/O 实际上非常困难,需要考虑许多不同的选项。

于 2013-03-19T14:53:26.343 回答