我不知道为什么这个方法返回一个空字符串:

- (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或用户的shell(例如~/.bashrc),以便nstask可以看到正确的环境($path)。

最佳答案

通过nstask运行任务使用fork()exec()来实际运行任务。用户的交互式shell根本不涉及。因为$PATH大体上是一个shell概念,所以当您谈论以其他方式运行进程时,它不适用。

关于objective-c - NSTask没有从用户环境中获取$ PATH,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/386783/

10-11 06:49