NSTask not picking up $PATH from the user's environment

bash, cocoa, nstask, objective-c, shell

Solution

Running a task via NSTask uses `fork()` and `exec()` to actually run the task. The user's interactive shell isn't involved at all. Since `$PATH` is (by and large) a shell concept, it doesn't apply when you're talking about running processes in some other fashion.

Problem

I don't know why this method returns a blank string: ``` - (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; } ``` If instead of passing `@"git"` as the argument, I pass `@"which"` I get `/usr/bin/which` returned as expected. So at least the principle works. from the terminal ``` $ which which $ /usr/bin/which $ $ which git $ /usr/local/git/bin/git ``` So it works there. The only thing I can think of is that `which` isn't searching through all the paths in my environment. This is driving me crazy! Does anyone have any ideas? EDIT: It looks like this is about setting up either NSTask or the user's shell (e.g., ~/.bashrc) so that the correct environment ($PATH) is seen by NSTask.

Original source

Related problems