2016-07-25 43 views
0
var cp = require("child_process"); 

var proc = cp.spawn("cmd"); 
proc.stdout.on("data", data => console.log("Data:", data.toString())); 
proc.stdin.write("help\n"); 
proc.stdin.write("help\n"); 

在上面的代码段控制台输出的结束时,你会如何检测何时流已完成写入的特定命令(即,当,如果这些命令是在所述终端执行时,它会显示一个闪烁的光标,你可以输入文字)?检测在node.js中

我已经尝试使用倾听事件end,但这似乎只在流程结束时才会被触发。

+0

你正试图产生一个命令提示符,通过它发出命令,然后检测这些命令何时完成?这听起来像个不好的主意,你能详细说明你想做什么吗? – Will

+0

我只是使用命令提示符作为例子,实际上我试图与'ghci'交互 - 可以像Haskell的repl一样运行。我想知道何时通过node.js在repl中发出的命令的输出已完成输出。 –

+0

@ thing789你可以输出一个命令从你的子进程到你的主进程并通过stdout监听它。 – hownowbrowncow

回答

1

除非您正在执行的程序具有定义明确的输出格式(例如换行符分隔的JSON,XML等),否则没有确切的方法可以知道。无论哪种方式,您将不得不执行某种程序输出的解析(并可能缓冲)。

+0

如果我在终端上运行一个命令(例如命令提示符),它似乎知道命令何时完成执行,因为它显示一个闪烁的光标。它会怎么做? –

+0

此时,命令提示符仍在运行,只是使用其他协议通知您执行的命令已完成。该协议是“显示命令提示符”。 @mscdex所说的是,你需要通过解析输出并寻找命令提示符来实现你的眼睛的软件版本。我对'ghci'不太熟悉,但要求谷歌似乎告诉我,你会在输出流中寻找'Prelude>'。 – Will

0

这可以通过给stdin一个字符串来解决,这个字符串在原始命令执行时会回显给你,你知道被执行的字符串没有不需要的效果,并且可能不会被输出到标准输出的命令,例如对于给定的例子:

var cp = require("child_process"); 

var proc = cp.spawn("cmd"); 
proc.stdout.on("data", data => { 
    var str = data.toString(); 
    console.log(str) 
    if(str.search("string to be detected") !== -1){ 
     console.log("Command finished!"); 
    } 
}); 
proc.stdin.write("help\n"); 
proc.stdin.write("string to be detected\n"); 

或者,也可以等待响应的某些特征,其指示该命令输出的结束,诸如换行或新的提示,如所建议的@mesdex和@ user866762