将数据管道传输到寻呼机

时间:2018-06-15 19:15:42

标签: process pipe crystal-lang

我在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

1 个答案:

答案 0 :(得分:1)

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)