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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top