NSTask -> NSPipe -> NSFileHandle ?
tablier
Membre
je souhaite exécuter : "/bin/bash -c export AEDebugSends=1; applicationPath ; unset AEDebugSends" et récupérer le résultat.
En suivant le modèle donné par Apple, j'ai écrit:
Help!
En suivant le modèle donné par Apple, j'ai écrit:
L'application se lance bien, mais les résultats s'affichent dans la console au lieu de remplir "cumul". Donc je n'ai pas connecté le pipe à la sortie des données du NSTask! J'ai beau lire et relire les exemples que j'ai, je ne trouve pas l'erreur!- (void)tacheExec:(NSString *)son_Chemin resultat:(NSMutableData *)cumul
{
NSString *laCommande ;
NSTask *task;
NSArray *arguments;
NSPipe *maPipe;
NSFileHandle *myfile;
NSData *inData;
[cumul setString:@\r] ;
inData = nil ;
// son_Chemin = chemin de l'exécutable
laCommande = [NSString stringWithFormat:@export AEDebugSends=1; %@; unset AEDebugSends", son_Chemin ] ;
arguments = [NSArray arrayWithObjects:@-c, laCommande, nil];
maPipe = [NSPipe pipe];
myfile = [maPipe fileHandleForReading];
task = [[NSTask alloc] init];
[task setLaunchPath: @/bin/bash];
[task setArguments: arguments];
[task setStandardOutput:maPipe ];
[task launch];
while ((inData = [myfile availableData]) && [inData length]) {
[cumul appendData:[NSData dataWithData:inData] ] ;
} ;
[task release] ;
}
Help!
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
En effet sur le Terminal, la sortie standard et l'erreur standard sont toutes les deux affichées à l'écran dans le même flux ce quittait qu'on ne peut pas les différencier : que l'exécutable lancé dans le terminal écrive sur stdout ou sur stderr, dans les deux cas ça s'affiche pareil dans le terminal... Mais si tu rediriges stdout vers un fichier (mais pas stderr) bah seul ce qui est écrit sur stdout sera donc redirigé (et ce qui est sur stderr restera non redirigé donc continuera de s'afficher dans le terminal).
Donc là c'est pareil si ton exécutable écrit sur stderr, tu auras beau rediriger stdout via setStandardOutput, ce qui est écrit sur la StandardError ne sera pas redirigé... Essaye en redirigeant aussi l'erreur standard pour voir du coup.
Bonjour,
Essaie ca
[task launch];
[task waitUntilExit];
NSData *resultats;
resultats = [myfile readDataToEndOfFile];
NSString *res= [[NSString alloc] initWithData:resultats encoding:NSUTF8StringEncoding];
NSLog(@resultat = %@",res);
Il me reste une question: Dans le débugger, je n'arrive plus a voir le contenu des variables après l'exécution de la tâche!! Est-ce que ce serait lié au bug du NSLog? dans la doc on trouve ceci:
J'ai ajouté la ligne conseillée comme décrit dans la doc et, Oh merveille, le debugger accepte de donner les représentations des variables!