将NSTask“/ bin / sh -c”命令转换为适当的管道代码

时间:2011-06-05 14:36:54

标签: objective-c cocoa nstask

有人可以帮助我将以下代码转换为代码,而代码中有两个用于“cat”和“grep”的NSTasks,显示两者如何通过管道连接在一起?我想我更喜欢后一种方法,因为那时我不再需要担心引用和填充。

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];

NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-c",
             @"cat /usr/share/dict/words | grep -i ham", nil];
[task setArguments: arguments];
[task launch];

更新:请注意,cat和grep在这里只是作为(糟糕的)示例。我仍然希望为更有意义的命令执行此操作。

1 个答案:

答案 0 :(得分:3)

为每个程序使用NSTask的实例,并将其标准输入/输出与NSPipe连接:

NSPipe *pipe = [[NSPipe alloc] init];
NSPipe *resultPipe = [[NSPipe alloc] init];

NSTask *task1 = [[NSTask alloc] init];
[task1 setLaunchPath: @"/bin/cat"];
[task1 setStandardOutput: pipe];
[task1 launch];

NSTask *task2 = [[NSTask alloc] init];
[task2 setLaunchPath: @"/bin/grep"];
[task2 setStandardInput: pipe];
[task2 setStandardOutput: resultPipe];
[task2 launch];

NSData *result = [[resultPipe fileHandleForReading] readDataToEndOfFile];