2010-07-11 5 views
6

J'utilise le code suivant dans mon projet Cocoa pour appeler un script que j'ai créé. Le script est dans le même dossier que le projet et apparaît même dans le dossier "Resources" dans XCode. Le chemin correct est trouvé, mais il dit toujours que le chemin n'est pas accessible. Aidez-moi, s'il vous plaît.Chemin de lancement NSTask non accessible

NSBundle *mainBundle=[NSBundle mainBundle]; 
NSString *path=[mainBundle pathForResource:@"script" ofType:@"sh"]; 

NSTask *task = [[NSTask alloc] init]; 
[task setLaunchPath: path]; 

NSLog (path); 

NSPipe *pipe = [NSPipe pipe]; 
[task setStandardOutput: pipe]; 
[task setStandardError: pipe]; 

NSFileHandle *file = [pipe fileHandleForReading]; 

[task launch]; 
[task waitUntilExit]; 

NSData *data = [ddFile readDataToEndOfFile]; 

NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 

NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; 
[f setNumberStyle:NSNumberFormatterDecimalStyle]; 
HDSpeed = [f output]; 

[f release];  
[task release]; 

La sortie que je reçois dans le débogueur est:

2010-07-10 17:53:26.384 tester[5023:a0f] /Users/guest/Library/Developer/Xcode/DerivedData/tester-bhukztmqjwoqrwereagsshvtbfqx/Build/Products/Debug/tester.app/Contents/Resources/script.sh

2010-07-10 17:53:26.386 tester[5023:a0f] launch path not accessible

Répondre

3

Ce que vous devez faire est d'obtenir le binaire shell, et passez votre script comme argument. Donc, si le script shell est écrit en ciblant bash, obtenez l'interpréteur bash, et passez-lui une liste d'arguments avec un argument: le chemin de votre script.sh.

+0

Merci! Je suis nouveau à OSX, alors pourriez-vous me dire où se trouve l'interprète de bash? – hassaanm

+1

/bin toujours sauf si l'utilisateur a modifié son installation de base, ce qui semble peu probable à cet égard. – jer

+0

Oh merci!/bin/bash semblait fonctionner mais maintenant le programme semble s'arrêter d'avancer après le lancement de la tâche. Une idée à ce sujet? – hassaanm

3

ajouter cette ligne avant [task launch]:

[task setLaunchPath:@"/bin/sh"]; 
2

Cette erreur se produit lorsque le script lui-même est pas marqué comme exécutable. Ouvrez une fenêtre de terminal et aller à l'endroit où le script est dans votre répertoire de projet, puis entrez ceci:

chmod +x script.sh 

Nettoyer et construire et vous pouvez utiliser le script directement - cela signifie aussi que vous pouvez transmettre des arguments à lui.

1

Lorsque je change le nom de mon script (stocké dans l'App Bundle) de foo.sh à foo.command, j'évite cette erreur.

let path = Bundle.main.path(forResource: "foo", ofType: "command") 

L'extension .command est ce qui est utilisé dans le Ray Wenderlich tutorial for NSTask/Process. Je ne peux pas trouver cela documenté nulle part (je m'assure également que le script est exécutable via chmod +x foo.sh).

Questions connexes