NSTask não coleta $ PATH do ambiente do usuário

Eu não sei porque este método retorna uma string em branco:

- (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; } 

Se em vez de passar @"git" como argumento, eu passo @"which" recebo /usr/bin/which retornou como esperado. Então, pelo menos, o princípio funciona.

do terminal

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

Então funciona lá.

A única coisa em que consigo pensar é o which não está procurando em todos os caminhos do meu ambiente.

Isto está me enlouquecendo! Alguém tem alguma idéia?

EDIT: Parece que isso é sobre como configurar o NSTask ou o shell do usuário (por exemplo, ~ / .bashrc) para que o ambiente correto ($ PATH) seja visto pelo NSTask.

Executar uma tarefa via NSTask usa fork() e exec() para executar a tarefa. O shell interativo do usuário não está envolvido de forma alguma. Como $PATH é (em geral) um conceito de shell, ele não se aplica quando você está falando sobre processos em execução de alguma outra forma.

Experimentar,

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

Isso funcionou para mim no Snow Leopard; Eu não testei em nenhum outro sistema. O -l (letra minúscula L) diz ao bash para “agir como se tivesse sido invocado como um shell de login”, e no processo ele pegou meu $ PATH normal. Isso não funcionou para mim se o caminho de boot foi definido como / bit / sh, mesmo com -l.

É / usr / local / git / bin em seu $ PATH quando você executa o programa? Eu acho which só parece no $ PATH do usuário.

Dê uma olhada na pergunta Descobrir a localização de um arquivo executável no Cocoa . Parece que o problema básico é o mesmo. A resposta infelizmente não é legal e legal, mas há algumas informações úteis lá.