2012-05-17 5 views
0

여기가 내 코드입니다. [email protected]"cd /\nls -l\n" 또는 [email protected]"ls -l\n"으로 설정하면 문제가 없습니다. 그러나 [email protected]"cd /\n"으로 설정하면 프로그램은 행 if ((output =[[outPipe fileHandleForReading] availableData]) && [output length])에서 작동하지 않으며 디버그 정보 출력이 없습니다.NSTask를 사용하여 쉘 명령을 실행할 때 NSPipe를 통해 출력되는 이상한 문제

"cd /" cmd가 다른 셸 명령과 다른지 알 수 없습니다. 조언 좀 해줄 수 있니?

NSData *inputData = [myCmd dataUsingEncoding:NSUTF8StringEncoding]; 
NSPipe *inPipe = [NSPipe pipe]; 
NSFileHandle *fh = [inPipe fileHandleForWriting]; 
[fh writeData: inputData]; 
NSPipe *outPipe = [NSPipe pipe]; 
//NSPipe *errPipe = [NSPipe pipe]; 
NSTask *task = [[NSTask alloc] init]; 
[task setStandardInput:inPipe]; 
[task setStandardOutput:outPipe]; 
[task setStandardError:outPipe]; 
[task setLaunchPath:@"/bin/sh"]; 
NSArray *args = [NSArray arrayWithObject:@"-s"]; 
[task setArguments:args]; 

[task launch]; 

NSData *output; 
NSString *string; 

if ((output =[[outPipe fileHandleForReading] availableData]) && [output length]) 
{ 
    string = [[NSString alloc] initWithFormat:@"%.s", [output bytes]]; 
} 
NSLog(@"%@", string); 

답변

1

cd / cmd를 다른 쉘 명령과 다른 경우 나도 몰라.

출력 내용을 쓰지 않는다는 점에서과 다릅니다. 프로그램이 -availableData (으)로 차단되어 프로그램이 차단 된 것 같습니다.


불행히도 아이디어를 시험해 볼 시간이 없지만 시도해 볼 항목이 있습니다.

  • 작업을 시작한 다음 데이터를 입력 파이프로 보낸 다음 입력 파이프를 닫을 수 있습니다. 작업이 입력 끝을 볼 때 출력 파이프를 닫습니다. 즉, -availableData에 대한 호출이 파일의 끝과 함께 반환됩니다.

  • 실행 루프를 사용하여 출력을 비동기 적으로 읽을 수 있습니다. 이것은 모든 명령을 한 번에 보낼 필요가 없다는 점에서보다 융통성이 있습니다. 완료되면 입력을 닫아야합니다.

  • 출력을 NSOperation에서 읽을 수 있습니다. NSOperation은 효과적으로 다른 스레드에 출력합니다. 다시 말하지만, 작업이 완료되면 입력 파이프를 닫아야합니다.

나는 당신이 할 수있는 마지막 일 같은 쉘에 cd를 보내는 것은 무의미 작업이다, 그런데, 지적한다. 다음으로 쉘이 종료되고 cd 결과가 손실됩니다. 현재 프로세스의 디렉토리를 변경하는 것이 목표 인 경우 [NSFilemanager changeCurrentDirectoryPath:]

+0

그러면 어떻게 처리 할 수 ​​있습니까? 조언 좀 해줄 수 있니? –

+0

@Tom Jacky : 나는 당신에게 몇 가지 제안을했다. – JeremyP