为了测试目的,我正在尝试打开一个提示popen3
内容的Ruby脚本。
我需要能够键入进程的STDIN并检查输出。到目前为止,我有这个:
require 'open3'
def run(executable, opts = {})
Signal.trap('CLD') do
puts 'STDIN:', @stdout.readlines
# @stderr.rewind
puts 'STDERR:', @stderr.readlines
# got EOF, trying to rewind gives me 'Errno::ESPIPE: Illegal seek'
[@stdin, @stdout, @stderr].each &:close
end
@stdin, @stdout, @stderr, @thread = Open3.popen3(executable)
@status = @thread.value
end
几天来一直在努力,我的大脑正在融化。
答案 0 :(得分:0)
您在信号处理程序中可以做的事情非常有限。例如,you are not allowed to do I/O in a signal handler。众所周知,信号处理程序容易出错。
您对使用Open3.capture*
有何看法?它同时从stdout和stderr读取时避免了所有的块/竞争条件。此外,它允许您传递stdin的数据。使用关键字参数:stdin_data
!