在mongo shell中键入未终止的命令时,它将返回三个点,表示需要更多输入才能完成此命令,如下所示:
> db.test.find(
... {
...
我正在使用nodejs child_process.spawn
创建一个mongo shell进程并监听其输出。我可以从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不能与交互式命令一起使用。
答案 0 :(得分:0)
您的代码不包含任何写入您的子进程的stdin的内容,所以如果您获得指示不完整命令的省略号,我会感到惊讶,实际上您根本不发送任何命令 - 不完整或其他。
话说回来,许多命令行实用程序在发现连接到stdin / stdout的真实终端时表现不同。例如。 git log
会在您直接运行结果时对结果进行分页,但在将结果传递给其他命令(例如git log | cat
时)则不会,所以这也可能是这种情况。
这也可能与缓冲有关 - 如果您的流是行缓冲的,那么您将看不到任何未立即以换行符结束的行。
真正的问题是:你看到>
提示了吗?你发送任何命令到mongo shell吗?
Scritping交互式CLI工具可能很棘手。例如。看看我在这里测试一个非常简单的交互式程序需要做些什么:
我必须创建两个命名管道,确保stdin,stderr和stdout没有缓冲,然后使用其他一些技巧使其工作。它是一个shell脚本,但它只是向您展示一个示例。