문제

내가 왜 이 방법을 반환하는 빈 문자열:

- (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 지 않을 찾을 통해 모든 경로에서 나의 환경입니다.

이 driving me crazy!사람이 어떤 아이디어가 있습니까?

편집: 그것은 다음과 같이 설정에 대해 하나 NSTask 또는 사용자의 껍질(예:~/.bashrc)도록 올바른 환경($경로)에 의해 볼 NSTask.

도움이 되었습니까?

해결책

작업 실행을 통해 NSTask 사용 fork()exec() 실제로 작업을 실행합니다.사용자의 대화형 쉘을 관여하지 않다.이 $PATH 입니다(대형)쉘 개념,이러한 내용이 적용되지 않 이야기 할 때는 프로세스를 실행하는 방법에 대한 몇 가지 다른 패션이다.

다른 팁

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

이 나를 위해 일했다오;에서 테스트 하지 않은 어떤 다른 시스템입니다.-L(소문자 L)알 bash 을"행동되었을 경우 호출로그",그 과정에서 그것을 내 normal$경로입니다.이 작동되지 않는 경우에 저를 시작 경로를 설정/비트/sh,도-l.

은/usr/local/git/bin 에서$PATH 프로그램을 실행할 때?나는 생각한 which 만 아니라서 사용자의$경로입니다.

을 살펴 질문 알아의 위치는 실행 파일에서 코코아.그것은 다음과 같은 기본적인 문제는 동일합니다.대답은 불행하게도 없고,깔끔한 하지만 거기에 몇 가지 유용한 정보다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top