2013-03-19 61 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