Преобразуйте команду NSTask "/ bin / sh -c" в правильный конвейерный код - PullRequest
2 голосов
/ 05 июня 2011

Может кто-нибудь помочь мне преобразовать следующий код в код, который вместо этого имеет два NSTasks для "cat" и "grep", показывая, как эти два могут быть связаны вместе с каналами? Полагаю, я бы предпочел последний подход, так как тогда мне больше не нужно беспокоиться о цитировании и прочем.

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 Ответ

3 голосов
/ 05 июня 2011

Используйте экземпляр 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];
...