处理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()
方便的一个包装,它提供了一个更强大的接口,并允许使用stdin
, stdout
和stderr
stream。
这个例子来自Node的文档,稍作修改。
您可以使用node-ffi来执行此操作,如以下示例所示: https : //stackoverflow.com/a/6288426/288425
只需用vim
replaceecho $USER
,就可以得到一个交互的vim会话。