objective-c cocoa bash shell nstask

objective c - NSTask no recoge $ PATH del entorno del usuario



objective-c cocoa (4)

Ejecutar una tarea a través de NSTask utiliza fork() y exec() para ejecutar realmente la tarea. El shell interactivo del usuario no está involucrado en absoluto. Como $PATH es (en general) un concepto de shell, no se aplica cuando se habla de ejecutar procesos de alguna otra manera.

No sé por qué este método devuelve una cadena en blanco:

- (NSString *)installedGitLocation { NSString *launchPath = @"/usr/bin/which"; // Set up the task NSTask *task = [[NSTask alloc] init]; [task setLaunchPath:launchPath]; NSArray *args = [NSArray arrayWithObject:@"git"]; [task setArguments:args]; // Set the output pipe. NSPipe *outPipe = [[NSPipe alloc] init]; [task setStandardOutput:outPipe]; [task launch]; NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile]; NSString *path = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; return path; }

Si en lugar de pasar @"git" como argumento, paso @"which" obtengo /usr/bin/which regresó como se esperaba. Entonces al menos el principio funciona.

desde la terminal

$ which which $ /usr/bin/which $ $ which git $ /usr/local/git/bin/git

Entonces funciona allí.

Lo único en lo que puedo pensar es en lo que no está buscando a través de todos los caminos en mi entorno.

¡Esto me está volviendo loca! ¿Alguien tiene alguna idea?

EDITAR: Parece que se trata de configurar NSTask o el shell del usuario (por ejemplo, ~ / .bashrc) para que NSTask vea el entorno correcto ($ PATH).


Tratar,

[task setLaunchPath:@"/bin/bash"]; NSArray *args = [NSArray arrayWithObjects:@"-l", @"-c", @"which git", nil]; [task setArguments: args];

Esto funcionó para mí en Snow Leopard; No he probado en ningún otro sistema. El -l (L minúscula) le dice a bash que "actúe como si se hubiera invocado como un shell de inicio de sesión", y en el proceso recogió mi $ PATH normal. Esto no funcionó para mí si la ruta de lanzamiento se estableció en / bit / sh, incluso con -l.



¿Está / usr / local / git / bin en su $ PATH cuando ejecuta el programa? Creo which solo se ve en $ PATH del usuario.