I am still trying to grasp the finer points of how I can run a linux or windows shell command and capture output within node.js; ultimately, I want to do something like this...
//pseudocode
output = run_command(cmd, args)
The important piece is that output
must be available to a globally scoped variable (or object). I tried the following function, but for some reason, I get undefined
printed to the console...
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" <------
I'm having trouble understanding where the code breaks above... a very simple prototype of that model works...
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" <----
Can someone help me understand why try_this()
works, and run_cmd()
does not? FWIW, I need to use child_process.spawn
, because child_process.exec
has a 200KB buffer limit.
Final Resolution
I'm accepting James White's answer, but this is the exact code that worked for me...
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);
A simplified version of the accepted answer (third point), just worked for me.
Usage:
Synchronous one-liner:
require('child_process').execSync("echo 'hi'", function puts(error, stdout, stderr) { console.log(stdout) });
I used this more concisely :
it works perfectly. :)
I had a similar problem and I ended up writing a node extension for this. You can check out the git repository. It's open source and free and all that good stuff !
https://github.com/aponxi/npm-execxi
Usage instructions are in the ReadMe file. Feel free to make pull requests or submit issues!
I thought it was worth to mention it.
A promisified version of the most-awarded answer:
To use:
Simplest way is to just use the ShellJS lib ...
EXEC Example:
ShellJs.org supports many common shell commands mapped as NodeJS functions including: