Todavía estoy tratando de comprender los puntos más finos de cómo puedo ejecutar un comando de shell de Linux o Windows y capturar la salida dentro de node.js; en última instancia, quiero hacer algo como esto ...
//pseudocode
output = run_command(cmd, args)
La pieza importante es que outputdebe estar disponible para una variable (u objeto) de ámbito global. Probé la siguiente función, pero por alguna razón, me undefinedimprimen en la consola ...
function run_cmd(cmd, args, cb) {
var spawn = require('child_process').spawn
var child = spawn(cmd, args);
var me = this;
child.stdout.on('data', function(me, data) {
cb(me, data);
});
}
foo = new run_cmd('dir', ['/B'], function (me, data){me.stdout=data;});
console.log(foo.stdout); // yields "undefined" <------
Tengo problemas para entender dónde se rompe el código anterior ... un prototipo muy simple de ese modelo funciona ...
function try_this(cmd, cb) {
var me = this;
cb(me, cmd)
}
bar = new try_this('guacamole', function (me, cmd){me.output=cmd;})
console.log(bar.output); // yields "guacamole" <----
¿Puede alguien ayudarme a entender por qué try_this()funciona y por qué run_cmd()no? FWIW, necesito usar child_process.spawn, porque child_process.exectiene un límite de búfer de 200 KB .
Resolución final
Acepto la respuesta de James White, pero este es el código exacto que funcionó para mí ...
function cmd_exec(cmd, args, cb_stdout, cb_end) {
var spawn = require('child_process').spawn,
child = spawn(cmd, args),
me = this;
me.exit = 0; // Send a cb to set 1 when cmd exits
me.stdout = "";
child.stdout.on('data', function (data) { cb_stdout(me, data) });
child.stdout.on('end', function () { cb_end(me) });
}
foo = new cmd_exec('netstat', ['-rn'],
function (me, data) {me.stdout += data.toString();},
function (me) {me.exit = 1;}
);
function log_console() {
console.log(foo.stdout);
}
setTimeout(
// wait 0.25 seconds and print the output
log_console,
250);
me.stdout = "";encmd_exec()para evitar la concatenaciónundefinedal principio del resultado.