2010-07-11 8 views
6

estoy usando el siguiente código en mi proyecto de cacao a llamar a un script que hice. La secuencia de comandos está en la misma carpeta que el proyecto e incluso aparece en la carpeta "Recursos" en XCode. Se encuentra la ruta correcta, pero todavía dice que la ruta no es accesible. Ayuda por favor.ruta lanzamiento NSTask no es accesible

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 salida consigo en el depurador es:

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

Respuesta

3

Lo que se necesita hacer es conseguir el binario de concha, y pasan su guión como argumento. Entonces, si el script de shell se escribe como objetivo de bash, obtenga el intérprete de bash y páselo por una lista de argumentos con un argumento: la ruta a su script.sh.

+0

Gracias! Soy nuevo en OSX, ¿podría decirme dónde se ubicaría el intérprete bash? – hassaanm

+1

/bin siempre a menos que el usuario haya modificado su instalación base, lo que parece improbable a este respecto. – jer

+0

¡Oh, gracias!/bin/bash parece funcionar, pero ahora el programa parece dejar de avanzar después de que se lanzó la tarea. ¿Alguna pista sobre esto? – hassaanm

3

añadir esta línea antes [task launch]:

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

Este error se produce cuando el guión en sí no está marcado como ejecutable. Abra una ventana de terminal e ir a donde la secuencia de comandos se encuentra en el directorio del proyecto, a continuación, introduzca la siguiente:

chmod +x script.sh 

limpieza y construcción y se puede utilizar directamente el guión - esto también significa que puede pasar argumentos a ella.

1

Cuando cambio el nombre de mi script (almacenado en el paquete de la aplicación) de foo.sh a foo.command evito este error.

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

La extensión .command es lo que se utiliza en el Ray Wenderlich tutorial for NSTask/Process. Parece que no puedo encontrar esto documentado en ningún lado (también me aseguro de que el script sea ejecutable a través del chmod +x foo.sh).

Cuestiones relacionadas