2

以下のテストでは、less pager コマンドを実行し、ユーザーが終了すると戻ります。問題は、ユーザーの入力を待たずに、ファイル全体を一覧表示して終了することです。プラットフォーム: xubuntu 12.04、Dart Editor ビルド: 13049。

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);
  };
}

次の CoffeeScript 関数 (nodejs I/O を使用) が機能します。

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

Dartでこれを機能させるにはどうすればよいですか?

4

2 に答える 2

4

John は、ユーザー入力の見方について良い例を示しています。しかし、元の質問には答えません。残念ながら、あなたの質問は Dart の動作に適合しません。あなたが持っている 2 つの例、Dart バージョンと CoffeeScript/Node.js バージョンは、2 つのまったく異なることを行います。

あなたの CoffeeScript バージョンでは、spawn コマンドは実際に新しいプロセスを作成し、実行をその新しいプロセスに渡します。基本的に、プログラムはプロセスと対話的に通信するのではなく、ユーザーは生成されたプロセスと対話しています。

Dart では違います。プログラムは生成されたプロセスと対話しています。新しいプロセスに実行を渡すことはありません。基本的に、あなたがしていることは、新しいプロセスとの間の入力/出力をプログラム自体にパイプすることです。プログラムには端末からの「ウィンドウの高さ」がないため、すべての情報を一度に渡します。ダーツで行っていることは、次とほぼ同じです。

less /etc/mime.types | cat

Process.start()を使用して、プロセスと対話的に通信できます。しかし、ユーザーではなく、プロセスと対話的に通信しているのはプログラムです。したがって、たとえば「zork」や「adventure」を起動して自動的に再生するダーツ プログラムを作成したり、プロセスの出力からのプロンプトを見てリモート サーバーにログインしたりできます。

ただし、現時点では、生成されたプロセスに単純に実行を渡す方法はありません。プロセスの出力をユーザーに伝え、さらにユーザーの入力を受け取ってプロセスに送り返す場合は、追加のレイヤーが必要です。それでも、すべてのプログラム (less など) がシェル環境から起動したときと同じように動作するわけではありません。

于 2012-10-02T16:11:23.260 に答える
3

ユーザーからのコンソール入力を読み取るための基本的な構造を次に示します。この例では、ユーザーからテキスト行を読み取り、'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!');
}
于 2012-10-02T13:45:42.583 に答える