NSTask 아$경로에서 사용자 환경
-
23-08-2019 - |
문제
내가 왜 이 방법을 반환하는 빈 문자열:
- (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
만 아니라서 사용자의$경로입니다.
을 살펴 질문 알아의 위치는 실행 파일에서 코코아.그것은 다음과 같은 기본적인 문제는 동일합니다.대답은 불행하게도 없고,깔끔한 하지만 거기에 몇 가지 유용한 정보다.