如何为未终止的命令获取mongoshell输出(三点)



当在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-ptypty.js。它们可以获得...输出,但它们将输入和输出数据混合在一起。无法将它们分开。我还尝试使用stdbufunbuffer来禁用缓冲区,但它仍然不起作用。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脚本,但它只是向您展示一个示例。

最新更新