2013-03-19 5 views
0

NSTask를 사용하여이 작업을 수행하는 솔루션을 읽었습니다. 모두 매우 길어 보입니다 ... 그래서이 코드를 사용하여 똑같은 작업을 수행했습니다 (표준 출력과 표준을 모두 얻음). 오류) :ObjC에서 쉘 명령 출력 얻기

NSTask *task = [NSTask new]; 
[task setLaunchPath:@"/bin/sh"]; 
[task setArguments:@[ @"-c", @"aCommand"]]; 
NSString *stringToRemove = [task description]; 
[task launch]; 
NSString *output = [[task description] stringByReplacingOccurrencesOfString:stringToRemove withString:@""]; 

이 솔루션을 사용하는 데는 단점이 있습니까? 출력을 필터링하는 더 짧은 방법이 있습니까?

답변

3

이 솔루션을 사용하는 데는 단점이 있습니까? 더 짧은 방법으로 출력을 필터링 할 수 있습니까?

예, 많은 단점이 있습니다. description이 마술처럼 태스크의 명령 행과 출력을 리턴하는 구현 세부 사항에 의존하고 있습니다. 그 문서에 의해 주장도 아니며 description 정말 디버깅/로깅을 넘어서 사용할 수 있습니다.

e.e. 그 코드는 편의상 만 작동합니다.

하지만 코드가 실제로 작동하지 않습니다. 실행하려는 명령이 절대로 종료되지 않거나 실행하는 데 시간이 오래 걸리거나 대량의 출력을 생성하는 경우 해당 코드는 실제로 출력을 가져 오지 않거나 잘린 출력을 내 보내지 않을 것입니다.

NSTask을 사용하는 예제가 약간 긴 경향이있는 이유가 있습니다. 프로세스 간의 I/O 관리는 실제로 매우 어렵습니다. 고려해야 할 여러 가지 옵션이 많이 있습니다.

+0

[task waitUntilExit]은 오래 지속되는 명령의 전체 출력 문제를 방지합니까? – user732274

+0

Nope; 'waitUntilExit'은 모든 출력이 생성되었음을 보장하지만, 출력을 소비하려면'NSPipe' 나'NSFileHandle'이 필요하고,'readInBackgroundAndNotify :'와 같은 것을 사용하면됩니다. – bbum