2

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

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

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

4

1 回答 1

0

当您通过管道传输内容时node,它希望从标准输入读取整个脚本。要使上述代码正常工作,您需要先关闭输入,然后才能读取输出。

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

显然,您需要先编写所有命令,然后才能读取任何输出。如果你想正确地与 REPL 交互,你需要创建一个 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 程序来评估您的命令并以某种易于解析的格式返回结果,您可能会成为更好的服务器。

于 2012-06-25T17:19:22.213 回答