【问题标题】:Piping data to a pager将数据传送到寻呼机
【发布时间】:2018-06-15 19:15:41
【问题描述】:

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


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

【问题讨论】:

    标签: process pipe crystal-lang


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2017-06-30
      • 2011-03-31
      相关资源
      最近更新 更多