2

下面的测试尝试运行 less pager 命令并在用户退出后返回。问题是它不等待用户输入,它只是列出整个文件并退出。平台:xubuntu 12.04,Dart 编辑器构建: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 的运作方式。您拥有的两个示例,Dart 版本和 CoffeeScript/Node.js 版本,做了两个完全不同的事情。

在您的 CoffeeScript 版本中, spawn 命令实际上是创建一个新进程,然后将执行传递给该新进程。基本上,您的程序不是与进程进行交互通信,而是您的用户正在与生成的进程进行交互。

在 Dart 中不同的是,您的程序正在与生成的进程进行交互。它不会将执行传递给新进程。基本上你正在做的是将输入/输出从新进程传送到你的程序本身。由于您的程序没有来自终端的“窗口高度”,因此它会一次传递所有信息。你在 dart 中所做的几乎等同于:

less /etc/mime.types | cat

您可以使用Process.start()与进程进行交互通信。但与进程交互通信的是您的程序,而不是用户。因此,您可以编写一个 dart 程序,该程序将启动并自动播放“zork”或“adventure”,或者通过查看进程输出的提示登录到远程服务器。

但是,目前还没有办法简单地将执行传递给生成的进程。如果您想将流程输出传达给用户,然后还接受用户输入并将其发送回流程,则它涉及一个附加层。即便如此,并非所有程序(例如 less)的行为都与从 shell 环境启动时的行为相同。

于 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 回答