有没有办法在Crystal中重定向STDERR?

时间:2018-02-25 08:07:42

标签: crystal-lang

在测试期间重定向STDERR会很方便。这在水晶中是否可行?

2 个答案:

答案 0 :(得分:4)

没有办法只使用标准库,但有一个外部库可以执行低级操作。

https://github.com/mosop/stdio
用于捕获标准I / O流的小型Crystal库

答案 1 :(得分:1)

这是一种可能的方式(灵感来自https://github.com/mosop/stdio

dup2包含在Libc中。必须定义dup。然后,您可以捕获STDOUT或STDERR:

lib LibC
  fun dup(oldfd : LibC::Int) : LibC::Int
end

def capture(origin)
  close_on_exec = origin.close_on_exec?
  begin
    o, i = IO.pipe
    dup = LibC.dup(origin.fd)
    origin.reopen(i)
    yield o
    LibC.dup2(dup, origin.fd)
    origin.close_on_exec = close_on_exec

  ensure
    o.close if o
    i.flush if i
    i.close if i
  end
end

STDERR.puts "a"
capture(STDERR) { |output|
  STDERR.puts "b\nc"
  puts output.gets.inspect
  puts output.gets.inspect
}
STDERR.puts "d"
capture(STDOUT) { |output| STDOUT.puts "this is ignored" }
puts "done"