Enchilada
Enchilada

Reputation: 3919

Convert NSTask "/bin/sh -c" command into proper pipeline code

Can someone help me convert the following code into code that instead has two NSTasks for "cat" and "grep", showing how the two can be connected together with pipes? I suppose I would prefer the latter approach, since then I no longer have to worry about quoting and stuff.

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];

Update: Note that cat and grep are here just meant as (lousy) example. I still want to do this for commands that make more sense.

Upvotes: 2

Views: 1157

Answers (1)

anon
anon

Reputation:

Use a instance of NSTask for each program and connect their standard inputs/outputs with 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];

Upvotes: 3

Related Questions