NSTask не получает $ PATH из среды пользователя - PullRequest
12 голосов
/ 22 декабря 2008

Я не знаю, почему этот метод возвращает пустую строку:

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

Если вместо передачи @"git" в качестве аргумента, я передам @"which", я получу /usr/bin/which, как и ожидалось. Так что, по крайней мере, принцип работает.

с терминала

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

Так оно и есть.

Единственное, о чем я могу думать, это то, что which не ищет все пути в моей среде.

Это сводит меня с ума! У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: Похоже, что это о настройке NSTask или оболочки пользователя (например, ~ / .bashrc), чтобы NSTask видел правильную среду ($ PATH).

Ответы [ 4 ]

19 голосов
/ 30 ноября 2009

Попробуйте,

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

Это сработало для меня на Snow Leopard; Я не тестировал ни на одной другой системе. -L (строчная буква L) говорит bash «действовать так, как если бы он был вызван как оболочка входа в систему», и в процессе он поднял мой обычный $ PATH. Это не сработало для меня, если путь запуска был установлен на / bit / sh, даже с -l.

12 голосов
/ 23 декабря 2008

Для запуска задачи через NSTask используются fork() и exec(), чтобы фактически запустить задачу. Интерактивная оболочка пользователя вообще не задействована. Поскольку $PATH является (по большому счету) концепцией оболочки, она не применяется, когда вы говорите о запущенных процессах каким-либо другим способом.

2 голосов
/ 22 декабря 2008

Есть ли / usr / local / git / bin в вашем $ PATH при запуске программы? Я думаю which смотрит только в $ PATH пользователя.

1 голос
/ 22 декабря 2008

Взгляните на вопрос Узнайте расположение исполняемого файла в Какао . Похоже, основная проблема та же. К сожалению, ответ не очень хороший и аккуратный, но там есть некоторая полезная информация.

...