NSTask不会从用户的环境拿起$ PATHNSTask不会从用户的环境拿起$ PATH(NSTas

2019-05-12 02:54发布

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

- (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)中,以便正确的环境($ PATH)由NSTask看到。

Answer 1:

通过NSTask运行任务使用fork()exec()实际运行任务。 用户的交互式shell是不参与的。 因为$PATH是(大体上)壳的概念,它不会当你谈论一些其他的方式运行的进程适用。



Answer 2:

尝试,

    [task setLaunchPath:@"/bin/bash"];
    NSArray *args = [NSArray arrayWithObjects:@"-l",
                     @"-c",
                     @"which git",
                     nil];
    [task setArguments: args];

这个工作对我的雪豹; 我没有任何其他的系统上进行测试。 -l(小写L)告诉Bash“行为,就好像它已经被援引作为登录shell”,并在这个过程中它拿起我的正常的$ PATH。 这并没有为我工作,如果启动路径设置为/位/ SH,即使-l。



Answer 3:

是/ usr /本地/ git的/ bin目录放进你$ PATH当你运行该程序? 我认为which只是看起来在用户的$ PATH。



Answer 4:

看看这个问题找出可可可执行文件的位置 。 它看起来像基本的问题是相同的。 不幸的是还没有很好的整洁,但有一些有用的信息出现。



文章来源: NSTask not picking up $PATH from the user's environment