NSTask não pegando $ PATH do ambiente do usuário
-
23-08-2019 - |
Pergunta
Eu não sei por que este método retorna uma cadeia 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 o argumento, eu passo @"which"
eu recebo /usr/bin/which
retornado como esperado. Assim, pelo menos as principais obras.
a partir do terminal
$ which which
$ /usr/bin/which
$
$ which git
$ /usr/local/git/bin/git
Por isso, trabalha lá.
A única coisa que posso pensar é que which
não está à procura através de todos os caminhos no meu ambiente.
Este é me deixando louco! Alguém tem alguma idéia?
EDIT: Parece que este é sobre a criação de qualquer NSTask ou o shell do usuário (por exemplo, ~ / .bashrc) para que o ambiente correto ($ PATH) é visto por NSTask
Solução
Executar uma tarefa via NSTask usa fork()
e exec()
para realmente executar a tarefa. shell interativo do usuário não está envolvido em tudo. Desde $PATH
é (de modo geral) um conceito shell, ela não se aplica quando você está falando sobre processos em execução de qualquer outra forma.
Outras dicas
Tente,
[task setLaunchPath:@"/bin/bash"]; NSArray *args = [NSArray arrayWithObjects:@"-l", @"-c", @"which git", nil]; [task setArguments: args];
Isso funcionou para mim no Snow Leopard; Eu não testei em qualquer outro sistema. O -l (L minúsculo) diz bash para "agir como se tivesse sido invocado como um shell de login", e no processo ele pegou meu $ PATH normal. Isto não funcionou para mim se o caminho de lançamento foi definida para / bit / sh, mesmo com -l.
é / usr / local / git / bin no seu $ PATH quando você executar o programa? Acho which
só olha no usuário $ PATH.
Veja a questão Saiba localização de um arquivo executável em Cocoa . Parece que o problema básico é o mesmo. A resposta, infelizmente, não é agradável e limpo, mas há alguma informação útil lá.