我正在尝试打开一个 Ruby 脚本,该脚本会提示输入带有 popen3
的内容,用于测试目的。
我需要能够输入过程的 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
已经尝试了好几天,我的大脑正在融化。
在
信号处理程序中允许执行的操作非常有限。例如,不允许在信号处理程序中执行 I/O。众所周知,信号处理程序很容易出错。
您如何看待使用Open3.capture*
?它避免了同时从标准输出和标准输出读取时的所有块/竞争条件。此外,它还允许您为标准输入传递数据。使用关键字参数 :stdin_data
!