2016-07-25 16 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