代码之家  ›  专栏  ›  技术社区  ›  WPeN2Ic850EU

将数据传送到寻呼机

  •  1
  • WPeN2Ic850EU  · 技术社区  · 8 年前

    我有一个ruby代码示例,它将数据通过管道传输到寻呼机,以便将其部分打印到stdout:

    input = File.read "some_long_file"
    pager = "less"
    
    IO.popen(pager, mode="w") do |io|
      io.write input
      io.close
    end
    

    我完全可以把它用在水晶上:

    input = File.read "some_long_file"
    pager = "less"
    
    Process.run(pager, output: STDOUT) do |process|
      process.input.puts input
      process.input.close
    end
    

    但如果我改变 pager = "more" ruby示例仍然可以正常工作,但是crystal片段转储所有数据,而不是将其分为多个部分提供。我怎么解决呢?


    晶体0.25.0[7FB783F7A](2018-06-11)
    LLVM:4.0.0
    默认目标:x86_64-unknown-linux-gnu

    1 回复  |  直到 8 年前
        1
  •  1
  •   felixbuenemann    7 年前

    这个 more 命令 tries to write it's user interface to stderr ,因此您还需要转发:

    Process.run(pager, output: STDOUT, error: STDERR) do |process|
      process.input.puts input
      process.input.close
    end
    

    由于您正在读取一个长文件,您可以考虑不将其读入内存,而是将文件描述符传递给管道:

    input = File.open("log/development.log")
    pager = "more"
    Process.run(pager, input: input, output: STDOUT, error: STDERR)