从node.js调用shell脚本

时间:2015-06-22 17:03:51

标签: r node.js shell exec

如何在Node.js中生成脚本并将其传递给shell?

E.g。我可以创建这个文件,例如hello.R,将其设为可执行文件chmod +x hello.R并从命令行./hello.R运行它:

#!/usr/bin/Rscript
hello <- function( name ) { return (sprintf( "Hello, %s", name ); })
cat(hello("World"));

我想做的是从Node做同等的事情。特别是在内存中生成一个更复杂的R脚本(例如,使用模板等作为字符串),执行它(使用execspawn?),并阅读stdout

但是我无法弄清楚如何将脚本传递给R.我试过这个(除其他外):

var rscript = [       
    hello <- function( name ) { return (sprintf( "Hello, %s", name ); })
    cat(hello("World"));
].join('\n');

var exec = require('child_process').exec;
exec(rscript, { shell: '/usr/bin/R'}, function(err, stdout, stderr) {
   if (err) throw(err);
   console.log(stdout);
}); 

然而,由于似乎/usr/bin/R/usr/bin/Rscript都不理解-c开关,因此失败了:

1 个答案:

答案 0 :(得分:2)

检查child_process的nodejs文档。您应该能够像在终端上一样spawn RscriptR命令,并通过child.stdin发送命令。

var c = require('child_process');
var r = c.spawn("R","");
r.stdin.write(rscript);
/* now you should be able to read the results from r.stdout a/o r.stderr */