2012-05-16 6 views
0

다음과 같은 코드가 있지만 괜찮습니다.하지만 그것에 대해 2 가지 질문이 있습니다.Objective-c : NSPipe에서 NSPipe가 잘못된 명령 에코를 출력하는 방법?

1) 내가 예를 들어, 일부 불법 항을 지정하면 @ "LS - L"다음 outString은 null입니다. 즉, "ls : - : No such file or directory"라는 오류 경고를 캡처 할 수 없습니다. ls : l : 해당 파일이나 디렉토리가 없습니다. 어떻게 처리 할 수 ​​있습니까? 나는이 기능을 구현할 수있는 방법

2) : 응용 프로그램의 현재 디렉토리 부여가 "/ 사용자/문서", 그리고 내가 수행 SH = @ "CD /", 나는 수행 쉬 = @ "LS -l "을 사용하여 다음 루프에서"/ " 디렉토리 아래의 내용을 봅니다. 그러나 새로운 루프가 시작되면 현재 디렉토리는 "/ user/Doc"로 재개됩니다. 마지막 루프의 작업 환경은 어떻게 유지할 수 있습니까?

또한 터미널에서 직접 작업하는 것처럼 "/ bin/sh"를 실행하기 위해 지속적인 작업을 수행 할 수 있습니까?

NSString *sh = @"ls -l"; 
while(sh != @"end"){ 
    NSTask *shData = [[NSTask alloc] init]; 
    [shData setLaunchPath: @"/bin/sh"]; 

    NSArray *args; 
    args = [NSArray arrayWithObjects: @"-c", sh, nil]; 
    [shData setArguments: args]; 

    NSPipe *myPipe; 
    myPipe = [NSPipe pipe]; 
    [shData setStandardOutput: myPipe]; 
    [shData setStandardInput:[NSPipe pipe]]; 

    NSFileHandle *file; 
    file = [myPipe fileHandleForReading]; 

    [shData launch]; 

    NSData *data1;  
    data1 = [file readDataToEndOfFile]; 

    NSString *outString; 
    outString = [[NSString alloc] initWithData: data1 encoding: NSUTF8StringEncoding]; 

    NSLog(@"%@",outString); 
} 
+0

작업 디렉토리의 경우, 왜 [- [NSTask setCurrentDirectoryPath :]'를 사용하지 않을까요? –

+0

그건 내가 필요로하는 것이 아닙니다. 내 목적은 다른 args를 사용하여 작업을 연속적으로 실행하는 것이지만 다음 실행 환경이 마지막 실행 출력에 의해 결정되도록 요구합니다. 예를 들어, "cd /"작업을 실행 한 후에 "ls -l"을 실행하여 "cd /"를 실행 한 결과 "/"디렉토리 아래의 모든 내용을 표시하려고합니다. –

+0

Apple의 의사는 "NSTask 개체는 한 번만 실행할 수 있습니다."라고 말합니다. 쉘 서브 프로세스가 런타임에 args를 보유하고 수신하게하는 다른 방법이 있다면? –

답변

3
  1. 그 문자열은 표준 오류가 아닌 표준 출력에 있습니다. 오류 스트림을 확인하지 않으므로 오류 스트림을 찾을 수 없습니다.

  2. 서브 쉘이 작동하는 방식이 아닙니다. Google은 "왜 cd가 쉘에 내장되어 있는지"에 대해 많은 정보를 제공합니다.

+0

Thx, Carl. 표준 오류 검사를위한 샘플 코드를 제공 할 수 있습니까? –

+0

@TomJacky 그러면 [shData setStandardError : myPipe];'가됩니다. –

+0

표준 출력과 표준 오류 모두를 읽을 때 문제가 있습니다. 하나를 EOF로 읽으려고하면 다른 하나를 읽으려고하면 잠길 수 있습니다. 문제는 하위 프로세스가 읽지 않은 프로세스에 쓰기를 시도하고있는 것일 수 있다는 것입니다. 파이프의 커널 버퍼를 채우기에 충분하다면 리더 (이 코드)가 읽기를 기다리는 것을 차단하지만 다른 파이프가 닫힐 때까지 기다리는 것이 차단됩니다. '- [NSFileHandle readToEndOfFileInBackgroundAndNotify]'와 같은 것을 사용하여 적어도 하나를 비동기 적으로 읽어야합니다. –