J'essaie d'utiliser des tuyaux pour gérer une commande qui nécessite plusieurs entrées, mais je ne sais pas trop comment le faire. Voici un extrait de ce que j'essaie de faire. Je sais comment gérer la première entrée, mais je suis à perdre à la tuyauterie dans la deuxième entrée -newstdinpass
NSTask avec l'entrée de plusieurs tuyaux
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];
Je sais en utilisant hdiutil
de cette manière est un peu un hack, mais en termes de tuyaux , suis-je en train de le faire de la bonne façon?
Merci.
MISE À JOUR: Dans le cas où d'autres s'interrogent à ce sujet, une solution rapide à mon problème est de passer une chaîne à zéro terminal comme l'a indiqué Ken Thomases ci-dessous. Utilisez [[NSString stringWithFormat:@"oldpass\0newpass\0"] dataUsingEncoding:NSUTF8StringEncoding]
dans le tuyau. Maintenant, encore besoin d'apprendre à combler plusieurs NSTasks
avec des tuyaux ...
Merci pour votre code. Je suis encore un peu confus sur la façon de raccorder plusieurs tâches ensemble pour la même commande, mais je vais prendre une dalle dessus. – Daniel
Utilisez un tuyau comme sortie standard d'une tâche et l'entrée standard de la suivante. Puis un autre tuyau accrochera la sortie de la deuxième tâche à l'entrée du troisième. Etc. Si vous voulez envoyer une entrée à toute la chaîne, créez un tube et configurez-le en tant qu'entrée de la première tâche et écrivez-le comme vous l'avez déjà fait. Si vous voulez une sortie de la chaîne entière, créez un tube et définissez-le comme la sortie standard de la dernière tâche de la chaîne et lisez-la. –
vous avez enregistré le jour –