如何与来自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的格式返回结果。