Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSTask launch path not accessible. Works in Xcode. Error shown out of XCode

Ok. There are several questions on stack overflow about this. This question was the only question comes closest to mines, but it uses notifications.

The code is very simple. Create a new empty Mac OSX project and just paste the following code in the applicationDidFinishLaunching: method. It supposed to get the path of any executable file (in this case 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);

This code sets up two reading pipes and runs one command: which git.

If i run this in XCode i get this results corretly:

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

If i go to my build/Products/Debug folder and double click the executable file, i get this message printed on the console app:

enter image description here

Question: So, what is really the problem here? please just dont make an alternative solution... I also want to know what the problem is.. thanks.

like image 608
Just a coder Avatar asked Jun 27 '13 10:06

Just a coder


1 Answers

OK turns out the answer is on stack overflow, but its spread across different questions.

The question was asked here -> Commands with NSTask and here -> NSTask launch path not accessible as well

But their answers as of this date arent clear as to what the problem was. It's only after reading the question from NSTask not picking up $PATH from the user's environment (the question's title was misleading) and with these two answers NSTask not picking up $PATH from the user's environment and Find out location of an executable file in Cocoa that I realized the solution.

It looks like this is about setting up either NS Task or the user's shell (e.g., ~/.bashrc) so that the correct environment ($PATH) is seen by NSTask.

Solution:

[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];

However this assumes the user's shell is always bash and it will fail for others. Solve this by determining the shell.

NSDictionary *environmentDict = [[NSProcessInfo processInfo] environment];
NSString *shellString = [environmentDict objectForKey:@"SHELL"];
like image 144
Just a coder Avatar answered Oct 21 '22 21:10

Just a coder