Question

Je ne sais pas pourquoi cette méthode renvoie une chaîne vide:

- (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 au lieu de passer @"git" comme argument, je passe @"which" je reçois /usr/bin/which est revenu comme prévu. Ainsi, au moins le principe fonctionne.

à partir de la borne

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

Il y travaille.

La seule chose que je peux penser est que which ne cherche pas à travers tous les chemins dans mon environnement.

Ce me rend fou! Est-ce que quelqu'un a des idées?

EDIT: Il semble que ce soit au sujet de la mise en place soit NSTask ou le shell de l'utilisateur (par exemple, ~ / .bashrc) de telle sorte que l'environnement correct ($ PATH) est vu par NSTask

Était-ce utile?

La solution

L'exécution d'une tâche par NSTask utilise fork() et exec() pour exécuter réellement la tâche. shell interactif de l'utilisateur ne participe pas du tout. Depuis $PATH est (en gros) un concept de coquille, il ne vaut pas lorsque vous parlez des processus en cours d'exécution d'une autre manière.

Autres conseils

Essayez,

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

Cela a fonctionné pour moi sur Snow Leopard; Je ne l'ai pas testé sur tout autre système. Le -l (L minuscule) indique à bash « agir comme si elle avait été invoquée comme un shell de connexion », et dans le processus, il ramassé mon normale $ PATH. Cela ne fonctionne pas pour moi si le chemin de lancement a été réglé sur / bit / sh, même avec -l.

est / usr / local / git / bin dans votre PATH $ lorsque vous exécutez le programme? Je pense que which ne regarde que dans le $ PATH de l'utilisateur.

Jetez un oeil à la savoir l'emplacement d'un fichier exécutable Cocoa. Il semble que le problème de base est le même. La réponse est malheureusement pas agréable et soigné, mais il y a quelques informations utiles là-bas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top