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.
Eche un vistazo a la pregunta Encuentre la ubicación de un archivo ejecutable en Cocoa . Parece que el problema básico es el mismo. Desafortunadamente, la respuesta no es agradable y ordenada, pero hay información útil allí.
¿Está / usr / local / git / bin en su $ PATH cuando ejecuta el programa? Creo which
solo se ve en $ PATH del usuario.