处理Node.js中子shell的输出

时间:2012-02-03 22:14:10

标签: ruby node.js

如果我在Ruby中调用系统方法,它将在子shell中执行我的命令并输出它可以做的一切。所以如果我把它放在file.rb中:

system 'vim'

然后运行$ ruby file.rb它会启动Vim,以便我可以使用它。如果我在Node.js中执行我认为相同的操作并将其放入file.js:

var exec = require('child_process').exec;
exec('vim');

然后运行$ node file.js它启动Vim但不输出任何内容(除非我从子进程中捕获stdout并自己输出,这将无法正常工作)。我怎样才能实现我在Ruby with Node中所做的一切?

2 个答案:

答案 0 :(得分:1)

与Node中的许多函数一样,返回值实际上不是由函数调用本身返回的,而是传递给作为函数的最后一个参数传递的回调。这种设计允许Node的主循环在子进程运行时处理其他任务。

如果您只想打印孩子的stdout输出,请执行以下操作:

var exec = require('child_process').exec;

exec('vim', function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
});

如果您还想输出stderr和进程'退出代码,请尝试:

exec('vim', function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    console.log('exit code:', error ? error.code : 0);
});

另请注意,exec()只是spawn()周围的便利包装,它提供了更强大的界面,并允许您为stdinstdout和{{使用流1}}。

此示例取自Node的文档here,稍作修改。

答案 1 :(得分:0)

您可以使用node-ffi执行此操作,如下例所示: https://stackoverflow.com/a/6288426/288425

只需将echo $USER替换为vim,即可获得互动的vim会话。