如何与来自Ruby的节点REPL进行交互

我正在尝试编写一个与Node.js REPL交互的Ruby脚本。 当我做:

i = IO.popen('node', 'r+') i.write("console.log('hi')") 

写入调用返回写入的大小。 但是,如何取回REPL的输出进行处理? 我试过#read,它不会返回输出。

当你将东西pipe到node ,它希望从stdin中读取整个脚本。 为了使上面的代码工作,你需要closuresinput,然后才能读取输出。

 i = IO.popen('node', 'r+') i.write("console.log('hi')") i.close_write print i.read # => hi 

显然,在读取任何输出之前,您需要编写所有的命令。 如果你想正确地与REPL交互,你需要创build一个PTY 。 这里有一个小例子,它运行一些命令并打印输出。

 require 'pty' require 'expect' commands = ["console.log('hi')", "var a = 1", "console.log(a)"] PTY.spawn("node") do |r,w,pid| # r is node's stdout/stderr and w is stdin r.expect('>') commands.each do |cmd| puts "Command: " + cmd w.puts cmd r.expect(/(.*?)\r\n(.*)>/m) {|res| print "Output: " + res[2] } end end 

但是这种与REPL的交互往往是脆弱的。 我不知道你在做什么,但是你可以通过编写一个小的JavaScript程序来更好地服务于你的命令,并以一些易于parsing的格式返回结果。