- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我的代码:
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 文件时,它应该返回终端正在返回的内容。正确吗?
有什么想法吗?
以利亚
最佳答案
Xcode 错误
Xcode 中有一个错误,在启动使用标准输出的新任务后阻止它打印任何输出(它收集所有输出,但不再打印任何内容)。您将不得不调用 [task setStandardInput:[NSPipe pipe]]
让它再次显示输出(或者,将任务打印到 stderr 而不是 stdout)。
最终代码建议:
NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/sh"];
[server setArguments:[NSArray arrayWithObject:@"/path/to/server.sh"]];
[server setCurrentDirectoryPath:@"/path/to/current/directory/"];
NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];
[server launch];
[server waitUntilExit]; // Alternatively, make it asynchronous.
[server release];
NSData *outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile];
NSString *outputString = [[[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease]; // Autorelease optional, depending on usage.
关于objective-c - NSTask NSPipe - objective c 命令行帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3444178/
最近我一直在开发一个日志框架,我允许用户提供一个 NSPipe 来让日志下降,如果他们不希望日志消息转到控制台。 Logger 可以启用或禁用,禁用时,不应将任何数据发送到管道。 启用记录器后,很容易
是否需要释放NSPipe创建的写法 NSPipe *pipe = [NSPipe 管道]; ?实际上我没有调用 alloc 所以理论上我不应该调用release...我对吗? 最佳答案 是的,你说得对
我的应用程序使用 NSTask 启动 Python 脚本,然后该脚本通过 NSPipe 返回一个数组。我读取数据,将其粘贴在字符串中,然后显示它: NSMutableData *data = [[NS
我正在我的 OS X 应用程序中启动一些交互式进程,我希望能够从管道读取和写入。 例如:启动进程将等待用户输入命令。当用户完成时(又名按下回车键),进程将返回一些内容,然后再次等待用户。 目前,我使用
我正在为命令行应用程序编写一个非常简单的 GUI 工具。它只有 2 个按钮。 连接并退出。 在 applicationDidFinishLaunching 中,我运行以下命令 NSPipe *pipe
所以我遇到了这个问题,一旦这个 NSFileHandle/NSPipe 被触发......我的 CPU 使用和内存开始变得疯狂。问题是我发现很难找到这个泄漏。任何建议或帮助表示赞赏。干杯。 .h NS
我有一个用 Objective-C 编写的应用程序,并且正在尝试从用 C 编写的应用程序接收消息。看来我有两个选择...XPC 服务和管道。关于 NSPipe - 我正在尝试确定如何打开一个管道来监视
我需要将此部分添加到我的应用程序中,用户将在其中输入终端命令,例如“killall SpringBoard”,当用户按下按钮时,它将运行该命令。我知道如果您使用 System("") 函数,您可以运行
我正在通过网络接收编码音频流,但是混入了一堆数据,所以我需要接收数据包,去除音频然后播放音频。 AVAudioPlayer,它可能是也可能不是最好的工具,但它是我目前正在追逐的路径,需要来自 NSDa
我正在编写一个 Cocoa 应用程序,它需要执行一个 UNIX 程序并在生成时逐行读取其输出。我这样设置了 NSTask 和 NSPipe: task = [[NSTask alloc] init];
这是我的代码: task = [[NSTask alloc] init]; [task setCurrentDirectoryPath:@"/applications/jarvis/brain/"];
我正在 NSTask 对象中运行 Perl 脚本,其输出进入 NSPipe。我使用通知来定期接收其输出并更新 GUI。 Perl 脚本实际上生成了其他进程,其输出似乎没有进入此管道,但确实出现在调试器
我有一个 NSTask,它处理从 stdin 传递的参数。参数通过 NSFileHandle 传递。 它工作正常,但我们的命令行工具从 stdin 读取输入,直到收到 EOF 符号(通过按 Ctrl+
有人可以展示一个简单的例子来说明如何结合使用 NSTask 和 NSPipe 来做到这一点: Charlie AI - 通过终端运行与 AI 通信 我想使用 xcode 和 objective c 为
我正在尝试使用 NSTask 运行一个简单的 bash 脚本并将输出定向到 TextView 。执行任务后,我的应用程序的 CPU 使用率是 100%,即使它是一个简单的 echo(目前)。 我创建了
我正在尝试终止通过 NSTask 生成的 openvpn 任务。 我的问题: 我应该将 ctrl+c (SIGINT) 发送到我的 NSTask 的输入 NSPipe 吗? inputPipe = [
我是一名优秀的程序员,十分优秀!