NSTask no recoger $ PATH del entorno del usuario
-
23-08-2019 - |
Pregunta
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"
consigo /usr/bin/which
regresó como se esperaba. Así, al menos, las obras principales.
desde el terminal
$ which which
$ /usr/bin/which
$
$ which git
$ /usr/local/git/bin/git
Así que trabaja allí.
La única cosa que puedo pensar es que which
no busca a través de todos los caminos de mi entorno.
Esto me está volviendo loco! ¿Alguien tiene alguna idea?
EDIT: Parece que este es acerca de la configuración, ya sea NSTask o shell del usuario (por ejemplo, ~ / .bashrc) para que el ambiente correcto ($ PATH) es visto por NSTask
Solución
La ejecución de una tarea a través NSTask utiliza fork()
y exec()
realmente ejecutar la tarea. shell interactiva del usuario no está involucrado en absoluto. Desde $PATH
es (por lo general) un concepto de terminal, no se aplica cuando se está hablando de los procesos en ejecución de alguna otra manera.
Otros consejos
Trate,
[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 cualquier otro sistema. El -l (L minúscula) le dice a bash para "actuar como si hubiera sido invocada como un intérprete de ingreso", y en el proceso se recogió mi $ PATH normal. Esto no funcionó para mí si la ruta de lanzamiento se establece en / bit / sh, incluso con -l.
Es / / / git / bin usr locales en su $ PATH cuando se ejecuta el programa? Creo que sólo se ve en which
$ PATH del usuario.
Tome un vistazo a la pregunta Averigüe ubicación de una archivo ejecutable en Cocoa . Parece que el problema básico es el mismo. La respuesta, lamentablemente no es agradable y limpio, pero hay algo de información útil allí.