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

¿Fue útil?

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í.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top