2013-06-27 15 views
7

Ok. W związku z tym istnieje kilka pytań dotyczących przepełnienia stosu. This question was the only question jest najbliżej kopalni, ale używa powiadomień.Ścieżka uruchamiania programu NSTask jest niedostępna. Działa w Xcode. Błąd pokazany na XCode

Kod jest bardzo prosty. Utwórz nowy pusty projekt Mac OSX i wklej następujący kod w metodzie applicationDidFinishLaunching:. Powinien uzyskać ścieżkę dowolnego pliku wykonywalnego (w tym przypadku GIT).

NSTask *aTask = [[NSTask alloc] init]; 
NSPipe *outputPipe = [NSPipe pipe]; 
NSPipe *errorPipe = [NSPipe pipe]; 

[aTask setStandardOutput: outputPipe]; 
[aTask setStandardError: errorPipe]; 
[aTask setArguments:[NSArray arrayWithObject:@"which"]]; 
[aTask setLaunchPath:@"/usr/bin/git"]; 

NSFileHandle *outputFileHandler = [outputPipe fileHandleForReading]; 
NSFileHandle *errorFileHandler = [errorPipe fileHandleForReading]; 

[aTask launch]; 
[aTask waitUntilExit]; 

// Task launched now just read and print the data 
NSData *data = [outputFileHandler readDataToEndOfFile]; 
NSString *outPutValue = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 

NSData *errorData = [errorFileHandler readDataToEndOfFile]; 
NSString *errorValue = [[NSString alloc] initWithData:errorData encoding:NSUTF8StringEncoding]; 

NSLog(@"Error value: %@",errorValue); 
NSLog(@"Output Value: %@",outPutValue); 

Ten kod ustawia dwie linie odczytu i uruchamia jedno polecenie: which git.

jeśli uruchomię to w Xcode i dostać to powoduje corretly:

Error value: "" 
Output Value: /usr/bin/git 

jeśli pójdę do mojego kompilacji/Produkty/folderu Debug i kliknij dwukrotnie plik wykonywalny, dostaję ten komunikat wydrukowany na app konsoli :

enter image description here

Pytanie: Więc, co jest naprawdę problem? proszę po prostu nie robić alternatywnego rozwiązania ... Chcę również wiedzieć, jaki jest problem .. dzięki.

Odpowiedz

13

OK okazuje się, że odpowiedź dotyczy przepełnienia stosu, ale jest rozłożona na różne pytania.

padło pytanie tutaj ->Commands with NSTask i tutaj ->NSTask launch path not accessible także

Ale odpowiedzi poczynając od tej daty arent jasne, co było problemem. Dopiero po przeczytaniu pytania z NSTask not picking up $PATH from the user's environment (tytuł pytania wprowadzał w błąd) i dzięki tym dwóm odpowiedziom NSTask not picking up $PATH from the user's environment i Find out location of an executable file in Cocoa zdałem sobie sprawę z tego rozwiązania.

Wygląda to o konfigurowaniu NS zadanie lub powłokę użytkownika (na przykład ~/.bashrc), tak, że prawidłowe środowisko ($ path) jest postrzegana przez NSTask.

Rozwiązanie:

[task setLaunchPath:@"/bin/bash"]; 
NSArray *args = [NSArray arrayWithObjects:@"-l", 
       @"-c", 
       @"which git", //Assuming git is the launch path you want to run 
       nil]; 
[task setArguments: args]; 

Jednak zakłada to powłoka użytkownika jest zawsze bash i to nie dla innych. Rozwiąż to, określając powłokę.

NSDictionary *environmentDict = [[NSProcessInfo processInfo] environment]; 
NSString *shellString = [environmentDict objectForKey:@"SHELL"];