首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >node.js外壳命令执行

node.js外壳命令执行
EN

Stack Overflow用户
提问于 2013-01-22 20:25:12
回答 6查看 158.3K关注 0票数 114

我仍然在努力掌握如何运行linux或windows shell命令并在node.js中捕获输出的细节;最终,我想做这样的事情……

代码语言:javascript
复制
//pseudocode
output = run_command(cmd, args)

重要的一点是,output必须可用于全局范围的变量(或对象)。我尝试了以下函数,但由于某些原因,我将undefined打印到控制台...

代码语言:javascript
复制
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" <------

我很难理解上面的代码在哪里崩溃……该模型的一个非常简单的原型工作。

代码语言:javascript
复制
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" <----

有没有人能告诉我为什么try_this()能工作,而run_cmd()不能?顺便说一下,我需要使用child_process.spawn,因为child_process.exec有200KB的缓冲区限制。

最终解决方案

我接受詹姆斯·怀特的回答,但这就是对我有效的代码...

代码语言:javascript
复制
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);
EN

回答 6

Stack Overflow用户

发布于 2013-07-04 17:16:29

一个被接受的答案的简化版本(第三点),对我来说很有效。

代码语言:javascript
复制
function run_cmd(cmd, args, callBack ) {
    var spawn = require('child_process').spawn;
    var child = spawn(cmd, args);
    var resp = "";

    child.stdout.on('data', function (buffer) { resp += buffer.toString() });
    child.stdout.on('end', function() { callBack (resp) });
} // ()

用法:

代码语言:javascript
复制
run_cmd( "ls", ["-l"], function(text) { console.log (text) });

run_cmd( "hostname", [], function(text) { console.log (text) });
票数 78
EN

Stack Overflow用户

发布于 2014-04-18 22:40:29

我用得更简洁了:

代码语言:javascript
复制
var sys = require('sys')
var exec = require('child_process').exec;
function puts(error, stdout, stderr) { sys.puts(stdout) }
exec("ls -la", puts);

它工作得很完美。:)

票数 52
EN

Stack Overflow用户

发布于 2016-09-23 08:41:03

@TonyO‘’Hagan是一个全面的shelljs答案,但我想强调一下他的答案的同步版本:

代码语言:javascript
复制
var shell = require('shelljs');
var output = shell.exec('netstat -rn', {silent:true}).output;
console.log(output);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14458508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档