class Boxes::Subprocess
Standardise handling the stdout and stderr from Open3.
@example Print the values returned to stdout and stderr
Boxes::Utils::Subprocess.run 'ls' do |stdout, stderr, thread| puts stdout unless stdout == nil puts stderr unless stderr == nil end
Public Class Methods
run(command) { |line, nil, thread| ... }
click to toggle source
Create a new subprocess with a command, with a block for the response.
@param cmd [String] the command to run @yield [stdout, stderr, thread] Gives the stdout, stderr and process
thread to the block.
# File lib/boxes/subprocess.rb, line 16 def self.run(command) # rubocop:disable Metrics/MethodLength # see: http://stackoverflow.com/a/1162850/83386 Open3.popen3(command) do |_stdin, stdout, stderr, thread| # read each stream from a new thread { out: stdout, err: stderr }.each do |key, stream| stream.each_line do |line| if key == :out yield line, nil, thread if block_given? elsif key == :err yield nil, line, thread if block_given? end end end thread.join # don't exit until the external process is done thread.value end end