2012-10-01 4 views
1

아래의 테스트에서는 less pager 명령을 실행하려고 시도하고 사용자가 종료 할 때 이 반환되면 반환합니다. 문제는 사용자 입력을 기다리지 않는다는 것입니다. 은 전체 파일을 나열하고 종료합니다. 플랫폼 : 분투 12.04는 다트 편집기 빌드 : 13049.Dart에서 대화 형 프로세스를 어떻게 실행합니까?

import 'dart:io'; 

void main() { 
    shell('less', ['/etc/mime.types'], (exitCode) => exit(exitCode)); 
} 

void shell(String cmd, List<String> opts, void onExit(int exitCode)) { 
    var p = Process.start(cmd, opts); 
    p.stdout.pipe(stdout); // Process output to stdout. 
    stdin.pipe(p.stdin); // stdin to process input. 
    p.onExit = (exitCode) { 
    p.close(); 
    onExit(exitCode); 
    }; 
} 

다음 커피 스크립트 기능 (I/O nodejs를 사용)는 작동합니다

shell = (cmd, opts, callback) -> 
    process.stdin.pause() 
    child = spawn cmd, opts, customFds: [0, 1, 2] 
    child.on 'exit', (code) -> 
    process.stdin.resume() 
    callback code 

가 어떻게 다트에서이 작업을 할 수 ?

답변

2

다음은 콘솔 입력을 사용자로부터 읽는 기본 구조입니다. 이 예제는 사용자로부터 텍스트 줄을 읽고 'q'를 종료합니다.

import 'dart:io'; 
import 'dart:isolate'; 

final StringInputStream textStream = new StringInputStream(stdin); 

void main() { 
    textStream.onLine = checkBuffer; 
} 


void checkBuffer(){ 
    final line = textStream.readLine(); 

    if (line == null) return; 

    if (line.trim().toLowerCase() == 'q'){ 
     exit(0); 
    } 

    print('You wrote "$line". Now write something else!'); 
} 
3

John은 사용자 입력을 보는 좋은 예를 보여줍니다. 그러나 원래 질문에 대답하지 않습니다. 불행히도 귀하의 질문은 Dart의 운영 방식에 맞지 않습니다. 두 가지 예인 다트 버전과 CoffeeScript/Node.js 버전은 완전히 다른 두 가지 작업을 수행합니다.

CoffeeScript 버전에서 spawn 명령은 실제로 새 프로세스를 만든 다음 해당 새 프로세스로 실행을 전달합니다. 기본적으로 프로그램은 대화식으로 프로세스와 통신하지 않으며, 사용자는 생성 된 프로세스와 상호 작용합니다.

다트의 경우 프로그램이 스폰 된 프로세스와 상호 작용합니다. 새 프로세스에 실행을 전달하지 않습니다. 기본적으로 당신이하고있는 일은 입출력을 새 프로세스로 또는 프로그램에서 프로그램으로 파이프하는 것입니다. 프로그램은 터미널로부터 '창 높이'가 없기 때문에 모든 정보를 한 번에 전달합니다. 당신은 대화 형 프로세스와 통신 할 수 Process.start()을 사용할 수 있습니다

less /etc/mime.types | cat 

: 당신이 다트에하는 일은 거의 동일합니다. 그러나 그것은 사용자가 아닌 프로세스와 대화식으로 통신하는 프로그램입니다. 따라서 예를 들어 'zork'또는 'adventure'를 실행하고 자동으로 실행하는 다트 프로그램을 작성하거나 프로세스의 출력에서 ​​프롬프트를보고 원격 서버에 로그인 할 수 있습니다.

그러나 현재로서는 생성 된 프로세스에 실행을 단순히 전달할 수있는 방법이 없습니다. 프로세스 출력을 사용자에게 알리고 사용자 입력을 받아 다시 프로세스로 보내려면 추가 레이어가 필요합니다. 그리고 그때조차도, 쉘 환경에서 실행될 때와 마찬가지로 모든 프로그램 (예 : less)이 동일한 동작을하는 것은 아닙니다.

+0

위의 답변으로 몇 가지 샘플 코드를 포함 할 계획 이었지만 현재 프로세스에서 대화 형으로 읽지 못하게하는 버그가있는 것으로 보입니다. 프로세스가 스트림을 종료 할 때까지 버퍼가 프로세스에서 플러시되지 않는 것처럼 보입니다. http://dartbug.com/5607을 기다리고 다음 코드를 게시합니다. –

+0

훌륭한 설명 (문제 5607에 게시 한 코드)을 이용해 주셔서 감사 드리며 더 이상 벽에 머리를 두드리지 않아도됩니다. :-) –