我在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
答案 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)