Вопрос

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

- (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).

Это было полезно?

Решение

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

Другие советы

Пытаться,

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top