NSTAsk не получает $PATH из среды пользователя
-
23-08-2019 - |
Вопрос
Я не знаю, почему этот метод возвращает пустую строку:
- (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.Похоже, основная проблема та же.К сожалению, ответ не очень приятный и аккуратный, но там есть некоторая полезная информация.