Я пытаюсь использовать каналы для обработки команды, требующей нескольких входных данных, но не совсем уверен, как это сделать. Вот фрагмент того, что я пытаюсь сделать. Я знаю, как обращаться с первым входом, но не понимаю, что делать со вторым входом -newstdinpass
NSTask *task = [[NSTask alloc] init];
NSPipe *pipe = [NSPipe pipe];
[task setLaunchPath: @"/bin/sh"];
[task setArguments: [NSArray arrayWithObjects: @"-c", @"/usr/bin/hdiutil chpass -oldstdinpass -newstdinpass /path/to/dmg", nil]];
[task setStandardInput:pipe];
[task launch];
[[pipe fileHandleForWriting] writeData:[@"thepassword" dataUsingEncoding:NSUTF8StringEncoding]];
[[pipe fileHandleForWriting] closeFile];
[task waitUntilExit];
[task release];
Итак, я знаю, что использование hdiutil
таким образом немного хакерское, но с точки зрения каналов, правильно ли я это делаю?
Спасибо.
ОБНОВЛЕНИЕ: если другие задаются вопросом об этом, быстрое решение моей проблемы - передать строку с нулевым завершением, как указал Кен Томасес ниже. Используйте [[NSString stringWithFormat:@"oldpass\0newpass\0"] dataUsingEncoding:NSUTF8StringEncoding]
в трубу. Теперь еще нужно научиться соединять несколько NSTasks
трубами...