2010-09-27 17 views
0

Voici mon code:A partir d'un fichier SH avec NSTask

-(void)startTask{ 
NSString * cmd = @"/bin/sh"; 
pty_ = [[PseudoTTY alloc] init]; 

NSTask * task = [[NSTask alloc] init]; 
[task setStandardInput:[pty_ slaveFileHandle]]; 
[task setStandardOutput:[pty_ slaveFileHandle]]; 
[task setStandardError:[pty_ slaveFileHandle]]; 

[task setCurrentDirectoryPath:[@"~" stringByExpandingTildeInPath]]; 
[task setLaunchPath:@"/bin/sh /applications/jarvis/brain/server.sh"]; 

[[NSNotificationCenter defaultCenter] 
      addObserver:self 
       selector:@selector(didRead:) 
        name:NSFileHandleReadCompletionNotification 
       object:[pty_ masterFileHandle]]; 

[[pty_ masterFileHandle] readInBackgroundAndNotify]; 

[task launch]; 

[self insertText: 
    [NSString stringWithFormat:@"Started %@ on terminal %@", cmd, [pty_ name]]]; 

} 

Mais, au lieu de cela, j'ai besoin pour démarrer un fichier SH: /applications/brain/server.sh

Je m confus ....

Quelqu'un peut-il m'aider avec mon code?

merci, Elijah

Répondre

0
[task setCurrentDirectoryPath:[@"~" stringByExpandingTildeInPath]]; 

Vous pouvez simplement appeler NSHomeDirectory pour obtenir le chemin de répertoire.

[task setLaunchPath:@"/bin/sh /applications/jarvis/brain/server.sh"]; 

Ce fichier n'existe pas. Il n'y a pas de répertoire nommé "sh" dans le répertoire/bin; en tant que tel, il n'y a pas de sous-répertoire "applications", pas de sous-répertoire "jarvis", pas de sous-répertoire "brain" et pas de fichier "server.sh". N'oubliez pas que NSTask n'est pas l'interpréteur de commandes. Les tours de coquillage ne fonctionnent pas dessus; il n'analyse pas les arguments, interpole les variables d'environnement ou ~ (remarquez que vous deviez le faire explicitement), ou quoi que ce soit d'autre que fait le shell. Vous ne pouvez utiliser le shell que de la même manière que n'importe quel autre programme.

Vous devez définir le chemin de lancement du chemin d'accès au shell et transmettre le chemin d'accès au script shell en tant que premier argument. Sinon, si vous savez que le fichier de script shell est exécutable (et qu'il contient le bon shebang), vous pouvez passer le chemin d'accès au fichier de script comme chemin de lancement et omettre les arguments.