2016-07-25 4 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, завершил вывод. –

+0

@ thing789 вы можете вывести команду из вашего дочернего процесса в ваш основной процесс и прослушать его через stdout. – hownowbrowncow

ответ

1

Нет никакого определенного способа узнать, если программа, которую вы выполняете, имеет четко определенный формат вывода (например, JSON, XML и т. Д.). В любом случае вам придется выполнить какой-то разбор (и возможную буферизацию) выхода программы.

+0

Если я запускаю команду на терминале (например, командную строку), она, похоже, знает, когда команда закончила выполнение, потому что она показывает мигающий курсор. Как это сделать? –

+0

В этот момент командная строка все еще запущена, и она просто использует другой протокол, чтобы уведомить вас о завершении выполненной команды. Этот протокол «показывает командную строку». Что @mscdex говорит, что вам нужно реализовать версию программного обеспечения ваших глаз, разобрав вывод и ищет эту командную строку. Я не слишком хорошо знаком с «ghci», но прошу google, похоже, сказать мне, что вы будете искать «Prelude>» в выходном потоке. – Will

0

Это можно решить, предоставив stdin строку, которая будет отозвана обратно вам, когда будет выполнена оригинальная команда, где вы знаете, что исполняемая строка не имеет нежелательных эффектов и, вероятно, не будет выводиться в stdout с выходом команды, например для данного примера:

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

Смежные вопросы