NSTask pas ramasser $ PATH de l'environnement de l'utilisateur
-
23-08-2019 - |
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
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.