用于交互式Unix命令的Cocoa包装器

bjz*_*bjz 9 unix cocoa objective-c command-line-tool interactive-mode

好的,所以我知道你可以使用Objective-C制作一个NSTask来运行命令行工具:

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/gdb"];
[task launch];
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有办法与交互式命令行工具进行通信gdb.这将涉及使基于用户交互的命令输入(如run,kill或quit用gdb),然后在此基础上输出该信息反应.

sjs*_*sjs 3

您可以将 NSTask 的setStandardInput:,setStandardOutput:和setStandardError:选择器与 NSPipe 实例结合使用来与启动的程序进行通信。

例如,要读取任务的输出:

task = [[NSTask alloc] init];
[task setStandardOutput: [NSPipe pipe]];
[task setStandardError: [task standardOutput]]; // Get standard error output too
[task setLaunchPath: @"/usr/bin/gdb"];
[task launch];
Run Code Online (Sandbox Code Playgroud)

然后,您可以获得一个NSFileHandle可用于读取任务输出的实例:

NSFileHandle *readFromMe = [[task standardOutput] fileHandleForReading]; 
Run Code Online (Sandbox Code Playgroud)

要设置向 gdb 发送命令的管道,您需要添加

[task setStandardInput: [NSPipe pipe]];
Run Code Online (Sandbox Code Playgroud)

在启动任务之前。然后你就得到NSFileHandle了

NSFileHandle *writeToMe = [[task standardInput] fileHandleForWriting];
Run Code Online (Sandbox Code Playgroud)

  • @bjz 那应该可行。不要忘记在字符串末尾附加“\n”以模拟用户在键入命令后按回车键。 (3认同)