这里是我的代码: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