当在mongo shell中键入一个未终止的命令时,它将返回三个点,表示需要更多的输入才能完成此命令,如下所示:
> db.test.find(
... {
...
我正在使用nodejschild_process.spawn
创建一个mongoshell进程并监听它的输出。我可以从mongo shell获得标准和错误输出,但无法获得...
输出。下面是我的nodejs代码:
const shell = spawn('mongo', params);
shell
.stdout
.on('data', (data) => {
winston.debug('get output ' + data);
});
shell
.stderr
.on('data', (data) => {
const output = data + '';
winston.error('get error output ', data);
});
我运行以下代码在shell上发送命令:
shell.stdin.write('db.test.find(');
我想知道为什么我不能用上面的方法得到...
的输出。这是一个特殊的输出吗?
EDIT1
我尝试使用node-pty
和pty.js
。它们可以获得...
输出,但它们将输入和输出数据混合在一起。无法将它们分开。我还尝试使用stdbuf
和unbuffer
来禁用缓冲区,但它仍然不起作用。nodejs child_process似乎不能很好地使用交互式命令。
您的代码不包括任何写入子进程的stdin的内容,因此如果您得到省略号,表示命令不完整,而实际上您根本没有发送任何命令-不完整或其他命令,我会感到惊讶。
话虽如此,当许多命令行实用程序发现连接到其stdin/stdout的真实终端时,它们的行为会有所不同。例如,当您直接运行git log
时,它将对结果进行分页,但当您将结果管道传输到git log | cat
等其他命令时,它不会对结果进行寻呼,因此这里也可能是这种情况。
这也可能与缓冲有关——如果您的流是行缓冲的,那么您不会立即看到任何未以换行符结尾的行。
真正的问题是:你看到>
提示了吗?你向mongo shell发送了任何命令吗?
编写交互式CLI工具可能很棘手。例如,看看我必须做些什么来测试一个非常简单的交互式程序:
- https://github.com/rsp/rsp-pjc-c01/blob/master/test-z05.sh#L8-L16
我必须创建两个命名管道,确保stdin、stderr和stdout没有缓冲,然后使用一些其他技巧使其工作。这是一个shell脚本,但它只是向您展示一个示例。