处理Node.js中的子shell的输出

如果我在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,但不输出任何东西(除非我从subprocess捕获标准输出,并输出它自己,这将不会很好)。 我如何实现我在Ruby中使用Node做的事情?

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

如果您只想打印孩子的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()方便的一个包装,它提供了一个更强大的接口,并允许使用stdinstdoutstderrstream。

这个例子来自Node的文档,稍作修改。

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

只需用vimreplaceecho $USER ,就可以得到一个交互的vim会话。