在测试期间重定向STDERR
会很方便。这在水晶中是否可行?
答案 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"