【发布时间】:2011-03-27 12:41:56
【问题描述】:
这是我的代码:
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 并查看其中是否包含任何内容。您可能还需要考虑在任务运行时从管道读取数据,因为如果它在您不读取时尝试向管道打印太多,并且缓冲区已填满,则任务将在下次尝试时挂起输出任何东西。
-
我不确定。你能给我举个例子吗?是的,我删除了 [task release] 和 [task waitUntilExit]。同样的问题。
-
您是在以编程方式(或在 gdb 中)检查 stringRead 的内容,还是尝试使用 NSLog 或其他方式将它们打印出来?如果您正在使用 NSLog 并且根本看不到任何输出,请在 Applications > Utilities 中检查控制台日志以获取输出。作为 NSTask 运行的 Shell 脚本可以使 Xcode 控制台输出停止工作。除此之外,我同意凯文的意见,以检查是否存在标准错误(只需添加第二个管道并将其设置为任务的标准错误),并且不依赖管道能够缓冲所有任务的输出。
-
以编程方式并通过 NSRunAlertPanel();只是为了测试。好的。我也会试试的。输出还有哪些其他选项?你能发布任何可能有帮助的例子吗?
-
我试过了,同样的问题....有什么想法吗?
标签: objective-c nsstring terminal nstask