2013-03-19 54 views
0

我已经阅读使用NSTask这样做的解决方案:他们都看起来非常非常长...因此,我设法使用此代码做同样的事情(它获得标准输出和标准错误):得到输出的命令在ObjC

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:@""]; 

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

回答

3

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

是的,很多缺点。你正在依靠一个实现细节,description会奇迹般地返回任务的命令行和输出。这不是由文档声明,也不是description超出调试/日志记录的使用。

I.e.该代码仅适用于便利。

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

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

+0

[任务waitUntilExit]是否避免了获得持续命令的完整输出的问题? – user732274 2013-03-19 14:57:00

+0

不是; 'waitUntilExit'将确保所有的输出已经生成,但是你仍然需要一个'NSPipe'或'NSFileHandle'来消耗输出,并且可能会用'readInBackgroundAndNotify:'这样的方法来完成。 – bbum 2013-03-19 15:01:53