管道数据到寻呼机

Piping data to a pager

我在 Ruby 中有一个代码示例,它通过管道将数据传输到寻呼机,以便将其分段打印到 STDOUT:

input = File.read "some_long_file"
pager = "less"

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

我可以像这样 Crystal 采纳它:

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 片段会转储所有数据,而不是分段提供数据。我该如何解决?


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

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)