這裏是我的代碼:NSTask NSPipe - 目標C命令行幫助
task = [[NSTask alloc] init];
[task setCurrentDirectoryPath:@"/applications/jarvis/brain/"];
[task setLaunchPath:@"/applications/jarvis/brain/server.sh"];
NSPipe * out = [NSPipe pipe];
[task setStandardOutput:out];
[task launch];
[task waitUntilExit];
[task release];
NSFileHandle * read = [out fileHandleForReading];
NSData * dataRead = [read readDataToEndOfFile];
NSString * stringRead = [[[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding] autorelease];
所以我想複製這樣的:
cd /applications/jarvis/brain/
./server.sh
但在Objective-C使用NSTask。
由於某些原因,當我運行此代碼時,stringRead,不會返回任何內容。它應該返回當我啓動.sh文件時終端正在返回的內容。正確?
任何想法?
利亞
你確定server.sh腳本輸出標準輸出嗎?也許你應該把stderr連接起來,看看它是否包含任何東西。 您可能還想考慮在任務運行時從管道讀取數據,因爲如果在您未讀取時嘗試向管道打印過多且緩衝區填滿,則下次任務將掛起它會嘗試輸出任何東西。 – 2010-08-09 21:07:34
我不確定。你能告訴我一個例子嗎?是的,我刪除了[任務發佈]和[任務waitUntilExit]。同樣的問題。 – objectiveccoder001 2010-08-09 21:23:54
你是否以編程方式(或在gdb中)檢查stringRead的內容,還是試圖使用NSLog或其他東西打印出來?如果您使用的是NSLog並且根本看不到輸出,請檢查您的輸出的「應用程序」>「實用程序」中的控制檯日誌。 Shell腳本作爲NSTask運行,可以使Xcode控制檯輸出停止工作。 除此之外,我第二凱文的意見,以檢查是否有標準錯誤的東西(只需添加第二個管道,並將其設置爲您的任務的標準錯誤),並且不依賴於管道能夠緩衝所有你的任務的輸出。 – puzzle 2010-08-09 21:39:40